【C#进阶系列】13 接口
C#不支持类的多继承,然而却可以继承多个接口。简单的就不说了,来看看下面的例子:
public interface IRead { string GetText(); } public interface IWrite { string GetText(); }
对于上面的这种情况,如果一个类同时继承上面两个接口,那么如何去实现这两个名字相同的方法呢?
显示接口方法(EIMI)
public class MyCpu:IRead,IWrite { string IRead.GetText() { return "这个方法实现IRead的方法"; } string IWrite.GetText() { return "这个方法实现IWrite的方法"; } public string GetText() { return "这个方法实现自己独有的方法"; } }
如上图,只需要在方法前面加上接口名即可。然而显示接口方法只能是私有方法。
然而这种方法要慎用,因为使用了这种方法后,值类型的实例在转换成接口时会发生装箱。因为是私有的,所以也不能被派生类调用。
最重要的是显示接口方法的调用很奇葩:
var cpu = new MyCpu(); Console.WriteLine(cpu.GetText()); Console.WriteLine(((IRead)cpu).GetText()); IWrite b = cpu; Console.WriteLine(b.GetText()); Console.ReadLine();
必须先转一道再调用,会让使用的人很困惑。
用基类还是用接口
- 基类更多的是一个身份上的事,比如鸟是燕子的基类。而接口是一个行为上的事,比如鸟和飞机都能飞,那么飞就是一个接口。
- 基类可以为派生类提供良好的默认实现。
- 基类添加一个方法,派生类自动就可以继承。而接口添加一个方法,派生类还需要重写。
然而我认为实际上仅仅用第一个来判断就好了,因为它更偏向于基于实际业务去考虑到底用基类还是接口。