Dart继承与实现疑问:类B为何无需重写define()方法?
Dart继承与实现机制的疑问解答
问题1:B类中的define()方法是来自A类还是Alphabet类?
B类的define()方法直接来自**Alphabet类**。因为B通过extends Alphabet继承了Alphabet的所有非私有成员,其中就包括define()方法的实现。
当B同时implements A时,Dart会检查B是否满足A的接口契约——也就是A暴露的所有公共方法(包括A从Alphabet继承来的define())。但由于B已经通过继承Alphabet拥有了define()的合法实现,所以不需要额外重写或实现该方法。
问题2:若该方法来自Alphabet类,那实现A类的意义是否被削弱?
并没有削弱,核心原因如下:
- Dart中
implements一个类的核心作用是让当前类满足目标类的接口契约,确保它可以被当作目标类的类型使用。比如你可以写A instance = B();,此时instance可以调用func1()、func2()和define(),B的实现完全符合A的接口要求。 - 当
B继承Alphabet时,刚好复用了define()的实现,避免了重复代码,但这并不影响implements A的契约意义。如果A后续新增了其他方法,B仍然会被要求实现这些新增方法,保证接口一致性。 - 如果你移除
B的extends Alphabet声明,Dart会要求你实现define(),这正是因为此时B没有其他途径满足A接口中define()的要求,必须自己提供实现。
内容的提问来源于stack exchange,提问作者Vishesh
相关产品推荐
相关产品推荐

