前面写了面向对象编程的三个【特征】----封装、继承、多态。
封装:用于隐藏内部实现,提供外部接口。
继承:子类继承父类成员,实现代码复用的一种方式。
多态:不同子类对同一个方法的不同实现。
接下来总结抽象类和接口在多态中的应用,以及比较重要的思想---面向接口编程。
面向对象的系统中,系统的各种功能都是由许许多多的对象协作完成的,这样各个对象之间的协作关系便成为系统设计的关键,程序设计需要考虑程序的维护性、扩展性,而面向接口编程实现的就是这样思想。
1、抽象类:是类的部分实现,用于约束其子类的行为,且允许不同的子类在此基础上拥有各自的实现。
c#中通过abstract关键字定义抽象类和抽象方法。
【语法】:public abstract class className
{
……
}
abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类。
【注意事项】:
⑴、抽象类不能被实例化,所以对抽象类使用 new 运算符会出现“编译时错误”。
⑵、不能是密封或静态的(抽象类需要被继承);(abstract不能与static、sealed同时使用)
⑶、可以包含具体实现的方法。
2、抽象方法:
【语法】:访问修饰符 abstract 返回值类型 方法名(参数列表);
【注意事项】:
⑴、没有方法体;
⑵、抽象方法一定存在于抽象类中,但抽象类中不一定有抽象方法。
⑶、当从抽象类派生非抽象类时,非抽象子类必须实现父类中所有的抽象方法。从而重写那些抽象成员。
【举例】:
抽象类 A 引入抽象方法 F。类 B 引入另一个方法 G,但由于它不提供 F 的实现,B 也必须声明为抽象类。
类 C 重写 F,并提供一个具体实现。由于 C 中没有了抽象成员,因此可以(但并非必须)将 C 声明为非抽象类。
1 abstract class A 2 { 3 public abstract void F(); 4 } 5 abstract class B: A 6 { 7 public void G() {} 8 } 9 class C: B 10 { 11 public override void F() { 12 // actual implementation of F 13 } 14 }
3、接口:(interface)一种既能让子类拥有多个父类的功能,又不破坏继承单根性的方法。
接口通常代表一个角色,它包装与该角色相关的操作和属性,而实现该接口的类便是扮演角色的演员。一个角色可以由不同的演员饰演,而这些演员除了扮演一个共同的角色外,并不要求具有其他共同点。
【语法】:[访问修饰符] interface 接口名
{
//接口体
}
【注意事项】:
1、接口名通常使用大写的“I”开头,表明其是接口类型;
2、接口可由方法、属性、事件和索引器4种成员类型的任意组合构成,不包含字段。
3、接口中定义的成员不能有具体实现;
4、接口中的成员不需要任何访问修饰,默认为public类型。