接口(Interface):
在以往我们对接口(Interface)的理解中,可以说接口就是一种契约,定义了遵守该契约的签名。
当然,接口和前面所说的抽象类很相似,不能被实例化,被继承时派生类必须实现接口中的签名。但是抽象类是特殊的类,只能是单继承,而接口可以多继承,接口可以包含属性,事件,索引器和方法(此方法不能包含实现的code)。实例1:
1 /*
2 * ${res:XML.StandardHeader.CreatedByYangbo}
3 * 用户: ${YangBo}
4 * 日期: 10/14/2011
5 * 时间: 13:50
6 *
7 */
8 using System;
9 using InterFaceTestDemo;
10
11 namespace InterFaceTestDemo
12 {
13 //接口可以多继承
14 public class Animal:IAnimal,IEat
15 {
16 private string name;
17 private Int32 age;
18 public Animal(string name,Int32 age)
19 {
20 this.age=age;
21 this.name=name;
22 }
23
24 public String Name
25 {
26 get
27 {
28 return name;
29 }
30 set
31 {
32 name=value;
33 }
34 }
35
36 public Int32 Age
37 {
38 get
39 {
40 return age;
41 }
42 set
43 {
44 age=value;
45 }
46 }
47
48
49
50 //接口可以包含方法
51 public interface IEat
52 {
53 void Eat();
54 }
55 //可以包含索引器
56 public interface INum
57 {
58 Int32 this[Int32 index]
59 {get;set;}
60 }
61
62 //接口可以包含属性
63 public interface IAnimal
64 {
65 String Name
66 {get;set;}
67 Int32 Age
68 {get;set;}
69
70 }
71 //包含事件
72 public interface IEvent
73 {
74 event EventHandler IsDog;
75 }
76 public class Dog:INum,IEvent
77 {
78 event EventHandler IsDog;
79 private void IsDog()
80 {
81 //ToDO: Something for this Function
82 }
83
84 private Int32[] arr=new Int32[100];
85 public Int32 this[Int32 index]
86 {
87 get
88 {
89 return arr[index];
90 }
91 set
92 {
93 arr[index]=value;
94 }
95 }
96 }
97
98
99 public static void Main()
100 {
101 Animal an=new Animal("Duck",2);
102 Console.WriteLine("name is {0},age is {1}",an.Name,an.Age);
103
104 Dog dog=new Animal.Dog;
105 Random ad=new Random(100);
106 for (int i = 0; i < 10; i++) {
107 dog[i]=ad.Next();
108 Console.WriteLine("The Elements #{0}={1}",i,dog[i]);
109 }
110 }
111
112 }
113 }
Interface and Virtual Class
很多时候,关于接口和抽象类的区别的文章不胜枚举,但是仍有很多疑惑,什么时候该用接口,什么时候该用抽象类呢?我们说接口是一个契约,是一组规则,继承接口的派生类或接口要遵守该接口的约束。比如上面实现的Animal类和IAnimal接口。也就是说,Animal类继承了IEat接口,那就必须要实现该接口所包含的Eat()方法。关于抽象类,强调更多的是共性,如所有实现了Animal类的动物都要吃,所以可以写一个抽象类的抽象方法,然后继承该类的Animal就都可以去KFC了,哈哈。另外,接口是不同类对象之前的行为抽象。抽象类是同类对象之间存在的抽象。
判断应用Interface or Virtual Class的原则
Is-A 与 CAN-DO关系,一个类型仅可以继承一个实现,如果基类和派生类有一个Is-A关系,就可以考虑用抽象类,也就像我们的Dog类和Animal类一样,我们可以说狗是动物,但不能说动物是狗,千万别!!这个就是Is-A的关系. 接口隐含一个CAN-DO关系,如果认为CAN-DO功能属于多个类型,就使用接口。
易用性。我们使用计算机的目的就是为了简单,方便(我这么想的,就目前计算机的作用不仅仅是这样的”简单“了)如果你的程序让测试的同事都无法忍受,那你还期望客户给你Silme么?当然在不影响性能与功能的前提下,代码越简单越好。有些地方感觉用抽象类或是接口都可以,那么为何不使用抽象类?!你要清楚,要重新创建接口,并且还要实现接口中的所有方法,还不能共享大量的代码,谁让你继承了呢?!
应用场景的不同才是抽象类和接口的区别的根本。项目是应需求而生的,有什么样的需求,然后再这样的场景下利用最合适的技术才是王道。
以上属个人观点,如有疑问可参与讨论。