接口

接口,就是契约,用于制定一种规则由大家遵守。例如INullable、ICloneable、IEnumerable、IComparable等,意指能够克隆、能够枚举、能够对比、只有实现了接口,才能实现此功能。

interface IDriveable
{
    void Drive();
}

面向 接口编程就意味着,在自定义类中要驾驭这种特性,就必须遵守这种契约。

public class BusDriver:IDriveable
{
  public void Drive(){
        Console.Writeln("由有经验的司机可以驾驭公共汽车");
}  
}

没有实现IDriveable接口的类型,则不被允许具有Drive这一行为特性,所以接口是一种行为规范。例如要使用foreach语句迭代,则操作类型必须实现IEnumerable接口。

实现接口还意味着,同样的方法对不同的对象表现为不同的行为。

public class TractorDriver:IDriveable
{
    public void Drive()
    {
          Console.WriteLine("拖拉机司机驾驭拖拉机");
    }
}
public class TractorDriver:IDriveable
{
    public void Drive()
    {
          Console.WriteLine("拖拉机司机驾驭拖拉机");
    }
}

在面向对象世界中,接口是实现抽象机制的重要手段,通过接口实现可以部分弥补继承和多态在纵向关系上的不足。接口在抽象机制上,表现为基于接口的多态性。

public static void Main()
{
  IList<IDriveable> drivers = new List<IDriveable>();
  drivers.Add(new BusDriver());
  drivers.Add(new CarDriver());
  drivers.Add(new TractorDriver());

  foreach(IDriveable driver in drivers){
  driver.Drive();
}
}

通过接口实现,同一个对象可以有不同的身份。

.Net中的接口

1:接口多继承

     在.Net中,CLR支持单实现继承和多接口继承。这意味者,同一个对象可以代表多个不同的身份。以DateTime实例代表多个身份。

    

public struct DateTime:IComprable,IFormattable,IConvertible,ISerializable,IComparable<DateTime>,IEquabable<DateTime>

   因此,可以通过DateTime实例代表多个身份,不同的身份代表不同的行为。

   

public static void Main()
{
    DateTime dt = DateTime.Today;
    int result = ((IComparable)dt).CompareTo(DateTime.MaxValue);
    DateTime dt2 = ((IConvertible)dt).ToDateTime(new System.Globalization.DateTimeFormatInfo());
}

 接口规则:接口隔离原则强调接口应该被实现为具有单一功能的小接口,而不要实现为具有多个功能的胖接口,类对于类的依赖应建立在最小的接口之上。

      接口支持多继承,既可以用于值类型,也可以作用于引用类型。

      接口不能被实例化,没有构造函数,接口成员被隐式声明为public 

posted @ 2021-11-30 20:58  马雪峰1  阅读(52)  评论(0编辑  收藏  举报