您的位置:首页 > 编程语言 > C#

浅谈C#中的多态及相关知识(主要内容来自msdn) -转载(benzite)

2007-09-29 17:54 274 查看
目录:



一、抽象类

二、接口

三、抽象类和接口的使用

四、类和接口的区别

五、覆盖与隐藏

一、 抽象类:

用abstract修饰的类叫抽象类。抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。

用abstract修饰的方法叫抽象方法。abstract 修饰符可以和类、方法、属性、索引器及事件一起使用。一个抽象方法只包含方法头而且没有实现代码。当一个类有一个或多个抽象方法时,此类本身必须声明为abstact。一个抽象类不能实例化.因为它包含有没有实现的方法。

在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

二、接口:

接口是引用类型的,类似于类,更和抽象类有所相似,以至于很多人对抽象类和接口的区别比较模糊。和抽象类的相似之处有三点:

1、不能实例化;

2、包含未实现的方法声明;

3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);另外,接口有如下特性:

接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。

一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。

接口实例

11 public delegate void Del();

22 public interface ITest

3 using System;

2 class A

3 class B: A

10 class Test

17using System;

2 class A

3 class B: A

10 class Test

17using System;

2class A

3class B: A

8class Test

13using System;

2class A

3class B: A

7class C: B

11class D: C

15class Test

19{

20 static void Main() {

21 D d = new D();

22 A a = d;

23 B b = d;

24 C c = d;

25 a.F();

26 b.F();

27 c.F();

28 d.F();

29 }

30}

C 类和 D 类均含有两个具有相同签名的虚拟方法:A 引入的虚拟方法和 C 引入的虚拟方法。但是,由 C 引入的方法隐藏了从 A 继承的方法。因此,D 中的重写声明所重写的是由 C 引入的方法,D 不可能重写由 A 引入的方法。此例产生输出:

B.F

B.F

D.F

D.F

请注意,通过访问 D 的实例(借助一个派生程度较小的类型,它的方法没有被隐藏起来),可以调用被隐藏的虚拟方法。

五、覆盖与隐藏



覆盖:

覆盖即重写,重写是指重写基类的方法,在基类中的方法必须有修饰符virtual,而在子类的方法中必须指明override。

格式:

基类中:

public virtual void myMethod()

{

}

子类中:

public override void myMethod()

{

}

重写以后,用基类对象和子类对象访问myMethod()方法,结果都是访问在子类中重新定义的方法,基类的方法相当于被覆盖掉了。

隐藏:

子类重定义父类的方法(函数声明一致),实现重定义只需要加上关键字new;

如果没有添加关键字new,那么编译器将默认添加new;

隐藏的成员是早绑定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐