请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于接口继承类的疑问

class Control {
  private state: any
}

interface SelectableControl extends Control {
  select(): void
}

class ImageC implements SelectableControl {
  private state: any
  select() { }

class Button extends Control implements SelectableControl {
  select() { }
}

SelectableControl 接口继承了 Control 类,所以 SelectableControl 接口有两个签名,一个是其自身的 select 方法签名,还有一个是从 Control 类 继承过来的私有属性 state 签名

ImageC 类为什么没有成功实现 SelectableControl 接口?ImageC 类内部也定义了一个私有属性 state 并且也实现了一个公共方法 select,ImageC 类 就是按照 SelectableControl 接口去定义的呀?

Button 类继承自 Control 类并且要实现 SelectableControl 接口,Button 类内部实现了 select 方法,但是 SelectableControl 接口还差一个私有属性 state 没有定义,但编译器告诉我们这么写是对的。没错,Button 类是继承了有私有属性 state 的 Control 类,但私有属性只有 Control 这个基类能使用,它的子类即 Button类 又访问不了它父类的私有属性呀,Button 类怎么就算实现了 SelectableControl 接口呢❓

正在回答

1回答

ustbhuangyi 2019-05-01 15:03:25

1. 虽然你在 ImageC 中定义了 state,但是和 Control 中的 state 并不是同一个,是不能兼容的。在类的章节,我们说过一段话,你再好好理解一下:

TypeScript 使用的是结构性类型系统。 当我们比较两种不同的类型时,并不在乎它们从何处而来,如果所有成员的类型都是兼容的,我们就认为它们的类型是兼容的。

然而,当我们比较带有 private 或 protected 成员的类型的时候,情况就不同了。 如果其中一个类型里包含一个 private 成员,那么只有当另外一个类型中也存在这样一个 private 成员,并且它们都是来自同一处声明时,我们才认为这两个类型是兼容的。 对于 protected 成员也使用这个规则。

2. 继承和可访问是 2 个概念,即使接口 SelectableControl 继承了 Control,你定义一个 SelectableControl 类型的变量,依然访问不了 state,因为它是私有属性。子类继承父类,也就是继承了父类的方法和成员,但是子类也是访问不了 state 的,但之所以继承 Control 的子类能够实现继承 Control 的接口,就是因为它们继承的私有成员是兼容的。

5 回复 有任何疑惑可以回复我~
  • 提问者 ysysyg #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2019-05-01 16:28:50
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信