接口包含内容概述1——接口相关概述及接口中属性的实现

前言:

     临近年终,和一朋友去应聘,偶见一C#选择题,问道:接口中不能包含什么?答案有:方法,属性,事件,字段。(我比较确定,应该选择字段,然而对于其确切原因却不能详述。这两天看到Steven John Metsker 的《C# 设计模式》中讲到“接口型模式设计”时,详细讲述了接口,以及接口中内容 。在此借助其讲述,将其做一概要。

 

接口和抽象类:

     为了更好的理解接口,最常见的问题莫过于接口和抽象类的区别。如前所述,博文《IL应用之——用IL分析接口的本质》 中已详细概述,用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 { getset; }
    }
    
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#属性、以及索引器。一个接口中也可以包含事件,但是不能包含委托,为什么?下节继续。。。

posted @ 2010-02-21 10:13  Youngman  阅读(4775)  评论(0编辑  收藏  举报