接口与抽象类
1.接口是什么?
接口定义一种协议,实现该接口的类或者结构必须遵循该协议。一个接口可以继承一个或多个其它接口,一个类或结构也可以实现一个或多个接口。接口本身不提供他所定义的成员实现,他仅仅实现该接口的类或结构必须提供的成员。
就像:工厂(类)要生产插座(接口成员),就必须要遵守国家制定的一种插座制造协议(接口),这种协议就规定了一些内容,比如外壳必须是绝缘体,内芯必须是金属导体.....;工厂可以遵循多个协议来生产插座,协议也可以从其他协议中扩充,而协议只是书面文章不会实现导电或是绝缘,但每个工厂必须按照协议的所有内容执行生产。
2.接口的使用演示(asp.net 程序代码)。
1 public interface IB //声明IB接口 接口的声明关键字是 interface 修饰符有public、protected、internal、private、new。
2 { 3 string sayHello(string name); 4 string Name { get;set; } 5 } 6 public interface IC : IB //接口IC继承于IB, 当然IC也可以继承多个接口,方法就是 public interface IC : IB ,ID{} 7 { 8 string sayDie(string name); 9 } 10 public class A:IB //声明A类,他的基类列表包含了IA接口,因此他实现了IA接口, 11 { //注意A类里面一定要实现IB接口里面有的所有方法,事件,属性,索引器。这里就是必须要实现sayHello方法,和Name属性
12 public string sayHello(string name) 13 { 14 string say = "Hello," + name + "!"; 15 return say; 16 } 17 string name; 18 public string Name 19 { 20 get { return name; } 21 set { name = value; } 22 } 23 } 24 public class C : IC //声明A类,他的基类列表包含了IC接口,因此他实现了IC接口,由于IC接口也继承于IB接口所以也要实现IB接口内的所有方法。 25 { 26 public string sayDie(string name) 27 { 28 string say = "go to die" + name + "!"; 29 return say; 30 } 31 public string sayHello(string name) 32 { 33 string say = "Hello," + name + "!"; 34 return say; 35 } 36 string name; 37 public string Name 38 { 39 get { return name; } 40 set { name = value; } 41 } 42 } 43 44 protected void Page_Load(object sender, EventArgs e) 45 { 46 A a = new A(); 47 Label1.Text = a.sayHello("Jim"); 48 C cc = new C(); 49 Label1.Text += cc.sayDie("Tom"); 50 } //结果是,hello jim go to die tom
3.抽象类和接口
抽象类使用abstract修饰符,它用于表示所修饰的类是不完整的,并且他只能做基类。抽象类与非抽象类有以下几个方面的区别。
1.抽象类不能直接实例化。如果抽象类使用了new运算符,则发生编译时错误。
2.允许(但不要求)抽象类包含抽象成员。
3.抽象类不能被密封。
4.当抽象类派生非抽象时,这些非抽象类必须实现所继承的所有抽象成员,即重写这些抽象成员。
代码演示
1 abstract class F //声明抽象类F
2 {
3 public abstract void A(); //声明抽象方法A();
4 }
5 abstract class G : F //继承于F类
6 {
7 public void H() { } //声明方法H()
8 }
9 class J : F //继承于F类
10 {
11 public abstract void A() //重写F类的A()方法。
12 {
13
14 }
15 }
16 //注意:G类未提供A()方法的实现,因此,他也必须声明为抽象类。J类重写了A()方法,而且不包含抽象成员,因此J
17 //类可以(单非必须)声明为非抽象类。
4. 接口和抽象类的几点区别
1.一个类能实现多个接口,但只能有一个父类。
2.接口中不能包含非抽象方法,但抽象类可以有。
3.抽象类是一个不完整的类需要进一步细化,而接口只是一个行为的规范,即一种协议。
4.接口基本不具备继承的任何特点,他只是承诺了能够调用的方法。
5.接口并不属于继承结构,他实际与继承无关,因此无关的类可以实现同一个接口。
6.接口可以用于支持回调,用于回调的接口仅仅是提供了指向方法的指针。
5. 规则与场合
1.请记住,面向对象思想的一个最重要的原则就是:面向接口编程。
2.借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程。
3.抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。
4.接口着重于CAN-DO关系类型,而抽象类则偏重于IS-A式的关系; 5.接口多定义对象的行为;抽象类多定义对象的属性;
6.接口定义可以使用public、protected、internal 和private修饰符,但是几乎所有的接口都定义为public,原因就不必多说了。
7.“接口不变”,是应该考虑的重要因素。所以,在由接口增加扩展时,应该增加新的接口,而不能更改现有接口。
8.尽量将接口设计成功能单一的功能块,以.NET Framework为例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包含一个公共方法。
9.接口名称前面的大写字母“I”是一个约定,正如字段名以下划线开头一样,请坚持这些原则。 10.在接口中,所有的方法都默认为public。
11.如果预计会出现版本问题,可以创建“抽象类”。例如,创建了狗(Dog)、鸡(Chicken)和鸭(Duck),那么应该考虑抽象出动物(Animal)来应对以后可能出现风马牛的事情。而向接口中添加新成员则会强制要求修改所有派生类,并重新编译,所以版本式的问题最好以抽象类来实现。
12.从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。
13.对抽象类不能使用new关键字,也不能被密封,原因是抽象类不能被实例化。
14.在抽象方法声明中不能使用 static 或 virtual 修饰符。