再谈多态,抽象类和接口
上一次博客已经概念性的概述了继承多态,抽象类和接口,这次来具体的谈一谈他们之间的联系和需要注意的地方。
一、继承和多态:Inheritance (继承) & Polymorphism(多态)
1、在父类中定义时:
创建的多态函数:注意使用virtual 关键字;
2、当子类实现父类并实现其特有的方法(覆盖父类的virtual方法)时:
注意使用override关键字
3、C#中的new关键字
在子类中使用new关键字来声明方法,则说明此函数并不是override父类的方法
4、子类必须重新定义其自己的构造函数,父类的构造函数不被继承
如果想调用父类的构造函数或者函数,则需要使用base关键字
5、几个访问修饰符的作用域:
访问修饰符 |
被修饰元素访问限制 |
public |
所有类都可访问 |
private |
只有本类或本结构体重可以访问 |
protected |
在本类或本结构体,或者在子类中可以被访问 |
internal |
在同一个项目文件中可被访问 |
protected internal |
在同一个项目文件或者其他项目文件中的子类中可被访问 |
二、抽象类(abstract class)
1、用abstract关键字声明抽象方法(方法隐式声明为virtual,且不能与static,virtual关键字混用)。
注意:在抽象类中也可以定义非抽象方法(即实现了内容的方法),当抽象类一定不能声明实体对象。
2、Abstract does force all the derived classes to implement the method, but nothing forces the derived derived classes to implement its own method.
(即子类已经继承了父类,并且实现了其定义的抽象函数,则孙子类没必要继续override了)
3、与abstract class 对应的是sealed class(密封类)
密封类不允许被继承和派生
三、接口(interface)
1、接口的定义及使用时,注意:
- 接口可以继续继承父接口从而产生新的接口
- 定义的接口与抽象函数很像,但接口类里面所有方法必须全部是定义,而不能实现。
- 接口中声明方法的定义时,不能加访问修饰符
- 继承一个接口,则必须实现该接口中的所有方法!!!
- 同一个类允许继承多个接口
- 某个类继承接口实现其方法时允许添加virtual关键字,进而后续实现多态
2、实现接口中的方法有两种;
隐式实现:访问修饰符 返回值类型 方法名{ ... }
显示实现:返回值类型 接口名称 . 方法名{ ... } (注意:不能有访问修饰符)
且使用时: