浅谈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;
隐藏的成员是早绑定。
一、抽象类
二、接口
三、抽象类和接口的使用
四、类和接口的区别
五、覆盖与隐藏
一、 抽象类:
用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;
隐藏的成员是早绑定。
相关文章推荐
- python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。
- python decorator知识理解, 主要内容来自廖雪峰的官方网站
- Dictionary 泛型类学习(学习内容来自MSDN)
- 转载:JAVA相关基础知识
- JAVA相关基础知识(转载)
- 非技术相关的面试技巧(文章内容来自他人博客)
- Android 串口读取设备相关知识。。总结比较乱,部分转载(未完)
- CMS内容管理系统开发-JavaScript相关知识及小游戏开发实例
- 如何使用MSDN搜索STL相关知识的一个小技巧
- 【转载】高频交易相关知识
- DataList嵌套,分页,点击父DataList标题在子DataList显示相关的内容,点击子DataList标题显示主要内容.
- 第一天上午——HTML网页基础知识以及相关内容
- long Learning 部分内容来自互联网,如有相关内容侵犯了您的权利,请联系博客主人处理
- DataList嵌套,分页,点击父DataList标题在子DataList显示相关的内容,点击子DataList标题显示主要内容.
- 面试知识相关内容-(1)
- 继承的相关知识以及多态的概念及理解
- GPU share memory 的应用 (主要内容转载)
- DataList嵌套,分页,点击父DataList标题在子DataList显示相关的内容,点击子DataList标题显示主要内容.
- 多态的相关知识