CSharpb Basic Tutorial Chapter-3-9 接口简介


什么是接口

  • 接口与class类似,但是它只为其成员提供了规格,而没有提供具体的实现
  • 接口的成员都是隐式抽象的
  • 一个class或者struct可以实现多个接口

interface

接口的实现

  • 接口的成员都是隐式public的,不可以声明访问修饰符
  • 实现接口对它的所有成员进行public的实现:

interfaceImplement1
interfaceImplement2

对象与接口的转换

  • 可以隐式的把一个对象转化成它实现的接口:

objectInterface

虽然Countdown是一个internal的class,但是可以通过把它的实例转化成IEnumerator接口来公共的访问它的成员。

接口的扩展

  • 接口可以继承其它接口

interfaceExpand

  • IRedoable继承了IUndoable的所有成员

显式的接口实现

  • 实现多个接口的时候可能会造成成员签名的冲突。通过显式实现接口成员可以解决这个问题。

obviousinterface1
obviousinterface2
obviousinterface3
obviousinterface4

  • 本例中,想要调用相应实现的接口方法,只能把其实例转化成相应的接口才行:

obviousinterface5

另一个显式实现接口成员的理由是故意隐藏那些对于类型来说不常用的成员。

virtual的实现接口成员

  • 隐式实现的接口成员默认是sealed的。
  • 如果想要进行重写的话,必须在基类中把成员标记为virtual或者abstract。

virtual
virtualdemo1
virtualdemo2
输出分别是 child parent parent 因为child里面写的方法相当于隐藏了子类的方法 所以接口最终调用的是父类的方法

virtualdemo3
Override 相当于覆盖了原来的方法

virtualdemo4
这三个都是输出 child

virtualdemo5
最后两个输出都是parent

virtual的实现接口成员

  • 无论是转化为基类还是转化为接口来调用接口的成员,调用的都是子类的实现:

virtualimplement

  • 显示实现的接口成员不可以被标记为virtual,也不可以通过寻常的方式来重写,但是可以对其进行重新实现。

virtualimplementdemo

在子类中重新实现接口

  • 子类可以重新实现父类已经实现的接口成员
  • 重新实现会“劫持”成员的实现(通过转化为接口然后调用),无论在基类中该成员是否是virtual的。无论该成员是显式的还是隐式的实现(但最好还是显式实现的)

childimplement

  • 转化为接口后调用重新实现的成员,就是调用子类的实现

childimplement2
childimplementdemo1
childimplementdemo2
输出Child Parent 既然已经转换为接口了 接口的直接实现就是它的父类 所以输出parent

childimplementdemo3
输出 Child child 实例是child

childimplementdemo4
输出 Child child parent

在子类中重新实现接口

如果Textbox是隐式实现的Undo:
childrebuildinterface1
那么:
childrebuildinterface2

  • 说明重新实现接口这种劫持只对转化为接口后的调用起作用,对转化为基类后的调用不起作用。
  • 重新实现适用于重写显式实现的接口成员。

重新实现接口的替代方案

  • 即使是显式实现的接口,接口的重新实现也可能有一些问题:
  • 子类无法调用基类的方法
  • 基类的开发人员没有预见到方法会被重新实现,并且可能不允许潜在的后果
  • 最好的办法是设计一个无需重新实现的基类:
  • 隐式实现成员的时候,按需标记virtual
  • 显式实现成员的时候,可以这样做:

childrebuildinterface3
如果不想有子类,那么直接把class 给 sealed。

接口与装箱

  • 把struct转化为接口会导致装箱
  • 调用struct上隐式实现的成员不会导致装箱

interfacebox


文章作者: Chaoqiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Chaoqiang !
评论
 上一篇
CSharp Basic Tutorial Chapter-3-10 枚举和嵌套类型 CSharp Basic Tutorial Chapter-3-10 枚举和嵌套类型
枚举简介 枚举是一个特殊的值类型,它可以让你指定一组命名的数值常量。 枚举的底层原理 每个枚举都对应一个底层的整形数值(Enum.GetUnderlyingType())。默认: 是int类型 0,1,2…会按照枚举成员的声明顺序自动赋
下一篇 
CSharp Basic Tutorial Chapter-3-8 struct 和访问修饰符 CSharp Basic Tutorial Chapter-3-8 struct 和访问修饰符
Struct struct和class差不多,但是有一些不同: struct是值类型,class是引用类型 struct不支持继承(除了隐式的继承了object,具体点就是System.ValueType) struct的成员class能
  目录