接口

接口使用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());

 

 

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