接口包含内容概述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 {  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#属性、以及索引器。一个接口中也可以包含事件,但是不能包含委托,为什么?下节继续。。。

你可能感兴趣的:(接口)