【问题标题】:Dart Abstraction & Polymorphism conundrumDart 抽象和多态性难题
【发布时间】:2021-10-09 16:59:22
【问题描述】:

请找到下面的 dart sn-p

class A {
  String m1_a() {
    return "A -> m1_a()";
  }
}

abstract class B extends A {
  @override
  String m1_a();
}

class C extends B {}

void main() {
  B c_b = C();

  print(c_b.m1_a()); //"A -> m1_a()"
}

问。为什么C不强制重写class B定义的抽象方法m1_a()

B 被声明为抽象类,因此理想情况下 m1_a() 也是子 C 的抽象方法!

【问题讨论】:

    标签: oop dart inheritance polymorphism abstraction


    【解决方案1】:

    Dart 类声明引入了 class(可以扩展和实例化)和 接口(可以实现)。 与其他类似语言不同,Dart 没有单独的interface 声明,您可以从任何类中提取接口。 非抽象类必须始终具有其自己的接口的实现。

    类声明中的具体方法,如int foo() => 42;,将方法签名引入声明的接口和声明的类的实现,并且由于它们匹配,因此该类确实实现了接口。

    int foo();这样的抽象方法,只是给接口增加了一个方法,不影响类。如果这个类是抽象的,并且没有实现foo,那很好。

    在这个例子中,B 类声明声明了String m1_a();,它为B 的接口添加了一个接口签名。这绝对没有效果,因为它还从A 的接口继承了相同的签名。 此外,B 类从 A 类继承了 m1_a 的实现,因此它成功实现了它的接口,一切都很好。

    TL;DR:抽象方法没有实现,对实现没有影响,只对接口有影响,所以它不会影响从A继承的具体方法实现。

    抽象方法不会影响继承的实现这一事实,可用于更新子类中的文档而不影响实现。示例:

    class A {
      /// Does something using A.
      int foo() => something + _private();
    
      int _private() => _somethingSpecial();
    }
    class B {
      /// Does something using B.
      int foo();
    
      int _private() => _somethingSpecialForB();
    }
    

    在这里您更改了Bfoo 的行为,因为您更改了它所依赖的私有函数的工作方式,但您没有更改A.foo 中的共享代码。您仍然可以更新B.foo 的文档,说明它有何不同。

    【讨论】:

    • 明白了!总而言之,m1_a() 不再是 B 类中的抽象方法,尽管它首先出现(通过语法)
    猜你喜欢
    • 2013-08-13
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2011-09-09
    相关资源
    最近更新 更多