接口包含内容概述1——接口相关概述及接口中属性的实现
前言:
临近年终,和一朋友去应聘,偶见一C#选择题,问道:接口中不能包含什么?答案有:方法,属性,事件,字段。(我比较确定,应该选择字段,然而对于其确切原因却不能详述。这两天看到Steven John Metsker 的《C# 设计模式》中讲到“接口型模式设计”时,详细讲述了接口,以及接口中内容 。在此借助其讲述,将其做一概要。
接口和抽象类:
为了更好的理解接口,最常见的问题莫过于接口和抽象类的区别。如前所述,博文《IL应用之——用IL分析接口的本质》 中已详细概述,用IL反编译工具,可以得出接口的本质,即编译为中间语言时,是采用抽象类的实现机制实现的(实现多态!)。然而接口和抽象类却存在实实在在的差异,具体体现在:
1.一个类可以实现任意多个接口,但是最多只能对一个抽象类进行子类化;
2.一个抽象类可以包括非抽象方法,而一个接口的所有方法在效果上都是抽象的;
3.一个抽象类可以声明并使用变量,而一个接口不能;
4.一个抽象类中的方法的访问修饰符可以是:public,internal,protected,protected internal,或者private,而接口中默认情况下都是public,而且在声明接口成员时,不允许使用访问修饰符;
5.一个抽象类可以定义构造函数,而一个接口不能;
上述5点区别主要是使用上,之所以将其区分开,是因为其使用场景是不同的 ,即功用性所在,主要可概括为:抽象类用在具有族层关系的继承关系上;而接口用在具有功能性意义上。
接口中属性的实现:
通常情况下接口中都是对应方法,然而其确实可以对属性 进行同样操作(以前只是知道,现在用代码实现之。)先看如下代码:
//CopyRight: http://www.cnblogs.com/yangmingming
//Notes: 为简便,将接口、类的建立,和验证代码放于一起
namespace ContentOfInterfaceDemo
{
public interface IFlyable
{
int Distance { get; }
string TypeOfFly { get; set; }
}
public class Bird : IFlyable
{
private int distance;
private string typeOfFly;
public int Distance
{
get { return distance; }
}
public string TypeOfFly
{
get { return typeOfFly; }
set { typeOfFly = value; }
}
}
class Program
{
static void Main(string[] args)
{
Bird bird = new Bird();
// bird.Distance = 10;
bird.TypeOfFly = "Using his Wings.";
Console.WriteLine("distance:{0},TypeOfFly:{1}", bird.Distance, bird.TypeOfFly);
}
}
}
经调试,结果如下:
可见我们实现了接口属性的继承!
接口中属性实现分析:
之所以属性可以像方法一样实现继承效果,从本质上并不难理解。在博文中《初识Ildasm.exe——IL反编译的实用工具》中,用IL代码讲述了属性的实现机制,即转变为对应的get和set函数,这样 在此文中所谓的属性实现,都可以转化为方法的实现,即问题迎刃而解,呵呵~(由此可见IL代码的分析重要性!)
附:问题
一个接口中可以包含方法、C#属性、以及索引器。一个接口中也可以包含事件,但是不能包含委托,为什么?下节继续。。。