本篇来尝试描述一下接口和继承的相关内容。

基本内容

函数和方法应该是同义的。

接口

在 Java 和 C# 里面, 有接口的概念。

大体上存在下面的规则。

  • 一个接口可以被另外一个接口继承
  • 在接口里面可以定义静态常量, 抽象函数, default 函数
  • 一个接口可以被另外一个类实现。
  • 当一个类实现了某个接口的时候, 需要实现该接口的所有非 default 函数
  • 一个类可以同时实现多个接口
  • 当一个函数的参数的类型为一个接口的时候, 可以传入该接口类型的实现类的对象。

继承

继承大体上存在下面的规则。

  • 一个类可以继承自另外一个类。 单继承的语言基本上一个类最多只能继承另外一个类,但是可以同时实现若干个不同的接口。
  • 子类可以看到父类的 所有非private的成员,包括变量,函数。
  • 在构造子类的时候会先构造出父类。
  • 父类看不到子类的属性
  • 一个类可以被诺干个不同的类分别继承。
  • 子类可以覆写父类的方法

主要思路

先来讨论一下如何实现继承, 继承的好处就是代码复用。

可以考虑下面的方式。

  • 在存放类型信息的结构里面添加一个新的字段, 表示父类列表。
  • 在构造当前类的时候, 优先构造一个父类
  • 搜索当前类成员的时候, 如果发现找不到,则让父类寻找

如果懒得实现接口的话,可以只实现类的继承, 然后使用多继承的方式代替接口。

这样做的话,可能会带来潜在的问题,但是可以节省一些工作量。

潜在的问题大概有下面这些:

  • 混乱度提高
  • 多个父类具有相同名称的成员的时候不好处理
  • 在构造父类的时候可能会存在一些问题。

可以使用规范的方式来尝试避免这些问题。

  • 使用 I 开头的类表示接口,并约定不再接口里面定义成员变量。
  • 所有的接口函数都提供一个默认实现, 实现的内容是抛出一个异常。

总结

核心的实现思路就是反推, 根据概念一条一条的实现即可。

拆解问题,划分为一个个更小的细节, 然后一一实现这些细节, 就会解决这个问题。 这个世界上的绝大多数问题都可以这么解决。