前言:

字段,然而对于其确切原因却不能详述。这两天看到Steven John Metsker 的《C# 设计模式》中讲到“接口型模式设计”时,详细讲述了接口,以及接口中内容 。在此借助其讲述,将其做一概要。

 

接口和抽象类:

     为了更好的理解接口,最常见的问题莫过于接口和抽象类的区别。用IL反编译工具,可以得出接口的本质,即编译为中间语言时,是采用抽象类的实现机制实现的(实现多态!)。然而接口和抽象类却存在实实在在的差异,具体体现在:

1.一个类可以实现任意多个接口,但是最多只能对一个抽象类进行子类化;

2.一个抽象类可以包括非抽象方法,而一个接口的所有方法在效果上都是抽象的;

3.一个抽象类可以声明并使用变量,而一个接口不能;

4.一个抽象类中的方法的访问修饰符可以是:public,internal,protected,protected internal,或者private,而接口中默认情况下都是public,而且在声明接口成员时,不允许使用访问修饰符;

5.一个抽象类可以定义构造函数,而一个接口不能;

 

上述5点区别主要是使用上,之所以将其区分开,是因为其使用场景是不同的 ,即功用性所在,主要可概括为:抽象类用在具有族层关系的继承关系上;而接口用在具有功能性意义上。

 

接口中属性的实现:

属性 进行同样操作(以前只是知道,现在用代码实现之。)先看如下代码:

//Description: 通过建立接口IFlyable和实现类Bird,演示接口中属性的实现方式

//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);
        }
    }
}

经调试,结果如下:

java 接口中可以有属性 接口类中可以包含属性_java 接口中可以有属性

 

 可见我们实现了接口属性的继承!

 

接口中属性实现分析:

本质上并不难理解,用IL代码讲述了属性的实现机制,即转变为对应的get和set函数,这样 在此文中所谓的属性实现,都可以转化为方法的实现,即问题迎刃而解,呵呵~(由此可见IL代码的分析重要性!)

 

附:问题

一个接口中可以包含方法、C#属性、以及索引器。一个接口中也可以包含事件,但是不能包含委托,为什么?下节继续。。。