- 什么是接口? 接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现部分。C#中接口可以包含属性、方法、索引器和事件声明。当某个类实现(implement)某个接口时候,这个类必须实现接口中的所有方法和其他成员。接口不能实例化。
- 什么是抽象类? 抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。另外,实现抽象方法由overriding方法来实现。
接口和抽象类的区别:
- 抽象类应主要用于关系密切的对象,是对具有相同特点的一类(族)事物的抽象,更加注重与这些事物的共同属性等。比如:猫(Cat)、狗(Dog)、鸟(Bird)等几类,就可以抽象为Animal抽象类,他们具有共同的特征比如嘴巴、眼睛、耳朵、脚等属性,也都有Eat吃东西的功能。Cat、Dog、Pig继承自Animal抽象类,也就具有这些属性。 因此抽象类强调的是一种IS-A的关系;为此我们可以有以下实现。
View Code
1 abstract class Animal
2 {
3 public abstract string Mouth { get; set; }
4 public abstract string Eye { get; set; }
5 public abstract string Ear { get; set; }
6 public abstract void EatFoot();
7 }
8
9 class Cat : Animal
10 {
11 public override string Mouth
12 {
13 get;
14 set;
15 }
16
17 public override string Eye
18 {
19 get;
20 set;
21 }
22
23 public override string Ear
24 {
25 get;
26 set;
27 }
28
29 public override void EatFoot()
30 {
31 Console.WriteLine("Eat Fish");
32 }
33 }
34
35 class Dog : Animal
36 {
37 public override string Mouth
38 {
39 get;
40 set;
41 }
42
43 public override string Eye
44 {
45 get;
46 set;
47 }
48
49 public override string Ear
50 {
51 get;
52 set;
53 }
54
55 public override void EatFoot()
56 {
57 Console.WriteLine("Eat Bone");
58 }
59 }
60
61 class Bird : Animal
62 {
63 public override string Mouth
64 {
65 get;
66 set;
67 }
68
69 public override string Eye
70 {
71 get;
72 set;
73 }
74
75 public override string Ear
76 {
77 get;
78 set;
79 }
80
81 public override void EatFoot()
82 {
83 Console.WriteLine("Eat worm");
84 }
85 } - 接口主要是定义一种规范或者行为,为不相关的对象提供统一标准的功能。比如Bird鸟类会Fly,而飞机也会Fly,他们之前并不属于同一种抽象类型,但是都有Fly的功能。因此,我们可以定义一个IFly接口具有Fly的功能;然后飞机和Bird都实现这个接口。因此,接口是对功能、行为的抽象,更强调一种“Can do”的关系。
在设计接口时候,尽量将接口设计成功能单一的功能块,要避免引起接口污染。“接口不变”是应该考虑的重要因素。在由接口增加扩展功能时候,应该增加新的接口,而不是更改现有接口。
View Code
1 interface IFly
2 {
3 void Fly();
4 }
5
6 class Plane : IFly
7 {
8 #region IFly 成员
9
10 public void Fly()
11 {
12 Console.WriteLine("Plane: I can fly with my iron wings");
13 }
14
15 #endregion
16 }
17
18 class Bird : Animal,IFly
19 {
20 public override string Mouth
21 {
22 get;
23 set;
24 }
25
26 public override string Eye
27 {
28 get;
29 set;
30 }
31
32 public override string Ear
33 {
34 get;
35 set;
36 }
37
38 public override void EatFoot()
39 {
40 Console.WriteLine("Eat worm");
41 }
42
43 #region IFly 成员
44
45 public void Fly()
46 {
47 Console.WriteLine("Bird:I can fly with my two wings");
48 }
49
50 #endregion
51 }