接口,就是契约,用于制定一种规则由大家遵守。例如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