作者回复: 举个例子:一个UI类库定义了一个Button类并提供了ButtonInterface接口。现在你想实现一个自己的Button类,添加些自定义属性,那么只能是Button的子类去实现ButtonInterface接口,其他的类不能实现这个接口,即使与Button具有相同的成员。 这种接口的存在,对子类起到了约束作用,保证了继承关系。
作者回复: 首先,在抽象类中可以包含方法的实现,也可以只声明不实现;而在接口中只能声明方法,不包含实现。 另外,抽象类侧重类别的抽象(定义这个对象是什么,比如:人类可以是男人的抽象类),而接口侧重功能的抽象(定义这个对象能做什么,比如:人可以吃喝跑跳)。
作者回复: 我同样觉得这句话有问题,我想这一段文字要传达的意思是,如果Control没有私有成员,实现SelectableControl的类可以是任何类;但Control有了私有成员,这个类就只能是Control的子类(Button)。记住这点就行了。
作者回复: 可以这样理解: Bus也具有Auto的私有属性,但在子类中访问父类的私有属性,显然是不能通过语法检查的,所以会报错。 所以只能在Bus的实例上体现,只不过这个例子不能修改这个属性。 看下面的例子,理解一下: class Auto { private length: number; constructor(length: number) { this.length = length; } } interface AutoInterface extends Auto {} class Bus extends Auto implements AutoInterface {} let bus = new Bus(10); console.log(bus); // Bus {length: 10}
作者回复: 这个意思是对的,但不存在应该不应该的问题,要看具体的目的是什么。(另外,接口是被类实现的,而不是实现类)
作者回复: 考虑这种场景:接口 IButton 继承了类 Button(含私有成员),那么 IButton 只能被 Button 或 Button 的子类实现。 假设 IconButton、TextButton 都是 Button 的子类,那么它们都可以实现 IButton 的结构。 但如果有另一个类 Text,它与 Button 毫不相干,就不能随意实现 IButton。
作者回复: 关键在怎么理解“AutoInterface 继承了 Auto 后,也包括了其中的私有和受保护成员”。注意,这么做的目的是限定接口的使用范围,并不会真正为这个接口添加类的私有和受保护属性(实际上接口也没有这种类型的属性),而这个限定范围就是:只能由子类来实现这个接口。
作者回复: 你可能是按照书写代码的顺序理解箭头的。 PPT中间的剪头表示接口可以由类来实现,类可以由接口来继承,理解这个就行了。