接口

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

接口使用interface关键字进行定义,例如

interface IComparable

{

int CompareTo(object obj);

}

接口描述可属于任何类或结构的一组相关行为。接口可由方法,属性,事件,索引器或这4种成员类型的任何组合构成。接口不能包含字段,接口成员一定是公共的。类和结构可以像类继承基类或结构一样从接口继承,但有两个例外:

(1)类或结构课继承多个接口

(2)当类或结构继承接口时,它继承成员定义,但不继承实现

接口在面向对象编程中起着非常重要的作用,是我们后面要用到的工厂,多层架构等的重要组成部分。下面通过一个小的例子来看接口所带来的方便

预先定义一个接口为小狗

public interface IDog

{

void Bark();

}

然后定义一个类MyDog来实现接口IDog,要注意的是,在类中必须要实现接口的方法,即使方法内是空的也必须要写上。

public class MyDog:IDog

{

public void Bark()

{

Console.WriteLine("wang,wang");

}

}

如果你的小狗某天会飞了,就成了

public class MyDog:IDog

{

public void Bark()

{

Console.WriteLine("wang,wang");

}

public void Fly()

{

Console.WriteLine("Flying now");

}

}

一般的情况下我们不去扩张原来的接口IDog,可以看出,把Fly方法放入IDog是不合理的(不是所有的小狗都会飞)。这时应该定义新接口给Fly方法

public interface IFlyable

{

void Fly();

}

然后MyDog的实现应该如下:

public class MyDog:IDog,IFlyable

{

public void Bark()

{

Console.WriteLine("wang,wang");

}

public void Fly()

{

Console.WriteLine("Flying now");

}

}

这样的好处是什么呢?比如在某个地方用到MyDog,如MyHoouse.直接放入MyDog会怎么样?

public class MyHouse

{

MyDog mydog=null;

public MyHouse(MyDog dog)

{

mydog=dog;

}

//有人进来,狗叫

public void ComeIn()

{

mydog.Bark();

}

//拍电影,狗飞

public void ShootMovie()

{

mydog.Fly();

}

}

但有一天需求改变了(软件里面需求改变是正确的),要求换你的狗而不是我的狗

public class YourDog:IDog,IFlyable

{

public void Bark()

{

Console.WriteLine("wang,wang");

}

public void fly()

{

Console.WriteLine("Flying now");

}

}

MyHouse怎么办?重新实现一遍?原来的MyHouse其实还有一个坏处是“与MyDog是紧密耦合的”。当代软件不够灵活的地方就在于紧耦合,而接口正是解决这种情况的灵丹妙药。所以一开始就不应该让MyHouse和MyDog紧密耦合,而应该对接口进行编程,代码如下

public void MyHouse

{

IDog _dog=null;

IFlyable _flyer=null;

public MyHouse(IDog dog,IFlyable flyer)

{

_dog=dog;

_flyer=flyer;

}

//有人进来,狗叫

public void ComeIn()

{

_dog.Bark();

}

//拍电影

public void ShootMovie()

{

_flyer.Fly();

}

}

这样无论是传MyDog或YourDog都可以,例如:

MyHouse house=new MyHouse (new MyDog(),new MyDog());

MyHouse house=new MyHouse(new YourDog(),new YourDog());

甚至还可以让MyDog在ComeIn里面叫唤,让YourDog在ShootMovie里面拍电影

例如:

MyHouse house=new MyHouse(new MyDog(),new YourDog());

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航