正文

C#Doorstep2面向对象程序设计篇52008-04-03 16:34:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xman/33900.html

分享到:


多态性

C#的多态性主要体现在方法(虚函数)重载上。

多态性是指不同的对象收到相同的消息时,会产生不同动作。从而实现一个接口,多个方法。它允许以相似的方式来对待所有的派生类,尽管这些派生类是各不相同的。例如动物Animal类的不同实体(猫,狗,猪,牛)的叫声都各不相同,它们的睡姿也大为迥异。

C#支持两种类型的多态性:

1)编译时的多态性是通过重载类实现的,系统在编译时,根据传递的参数个数、类型信息决定实现何种操作。

2)运行时的多态性是指在运行时,根据实际情况决定实现何种操作。C#中运行时的多态性通过虚函成员实现。

   类中两个以上的方法(包括隐藏的继承而来的方法)取的名字相同,只要使用的参数类型或者参数个数不同,编译器便知道在何种情况下应该调用哪个方法,这就叫做方法的重载。这样就实现了“一个接口,多种动作”。

    如果希望基类中某个方法能够在派生类中进一步得到改进,那么可以把这个方法在基类中定义为虚方法。类中的方法前加上了virtual修饰符成为虚方法,反之为非虚方法。使用了virtual修饰符后不允许再有static,abstractoverride修饰符。

普通方法重载要求方法名称相同,参数类型和参数个数不同,而虚方法重载要求方法名称、返回值类型、参数表中的参数个数、类型顺序都必须与基类中的虚函数完全一致。在派生类中声明对虚方法的重载要求在声明中加上override关键词,而不能有newstaticvirtual修饰符。

类成员的可访问性

public     访问不受限制

internal 访问权限是当前的程序集(可以简单理解为项目),也就是exe或者dll如果在同一个程序集中,假如有一个类A,其它类中想要使用A中的属性或方法的话,不管是new方法产生的还是继承产生的,都可以访问到protected internalinternal的方法。

但是如果A类不是在同一个程序集中,就有很大的区别了,首先,你用new方法产生对象中,不可以使用protected internalinternal来访问。继承的方式可以访问到protected internal,但不可访问internal 当你写的一些类,不想让外部访问,只想让它的子类范围内访问的话,使用protected internal可以起到很好的保护作用,它的访问仅限于从包含类派生的当前程序集或类型

private    访问仅限于包含类型,只有嵌套类允许访问级别

protected访问仅限于包含类或从包含类派生的类型,只有嵌套类允许访问级别

前面提到的protected访问修饰符可以将类成员的作用域限制在本类和由它所派生出的类中。例如在下面的代码中,将Weight成员变数声明为受保护后,就只有Animal和由它所派生的类可以访问该成员变量了。 

以下案例用语演示保护成员的使用。

using System;

class Animal

{

     protected double weight=100;

     public void Sleep()

     {

         Console.WriteLine("Sleeping");

     }

}

class Cat:Animal

{

     public void EatFish()

     {

         Console.WriteLine("Eat Fish");

     }

     public void GetWeight()

     {

         Console.WriteLine("{0}",weight);//派生类可以使用基类的保护成员

     }

}

class Dog:Animal

{

     public void EatBone()

     {

         Console.WriteLine("Eat Bone");

     }

     public void GetWeight()

     {

         Console.WriteLine("{0}",weight);

     }

}

class Exam2_9

{

     public static void Main()

     {

        Animal a=new Animal();

         a.Sleep();

        Cat c=new Cat();

         c.Sleep();

         c.EatFish();

         c.GetWeight();

         Dog d=new Dog();

         d.Sleep();

         d.EatBone();

         d.GetWeight();

        //Console.WriteLine("weight={0}",d.weight);//不能访问保护成员

     }

}

 

(To be continued)

阅读(2692) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册