如何正确代理“继承”静态方法?

时间:2016-10-17 19:12:19

标签: inheritance dart static-methods

我对Dart很新,并且仍在学习它带来的所有细微差别。我真正忙于处理当前任务的一件事是从父类继承(或代理)静态方法。

void main() {
  EnglishCasual.greet();
}

class English {
  static greet() {
    actGreeting();
    sayGreeting();
  }

  static sayGreeting() {
    print('hello');
  }

  static actGreeting() {
    print('<tips hat>');
  }
}

class EnglishCasual extends English {
  static sayGreeting() {
    print("m'lady");
  }

  static actGreeting() {
    print('<tips fedora>');
  }
}

上面给出了错误NoSuchMethodError: method not found: 'greet',根据Dart文档,它是预期的行为,因为静态方法不是继承的(这对我来说似乎很奇怪,但是好的。继续...)

然后我尝试了一个简单的代理到父类......

DartPad Example

但这会产生另一个错误:Invalid context for 'super' invocation'super' is only available in instance methods。好的......让我们按名称显式调用父类。

DartPad Example

但是,正如预期的那样,这被视为对English.greet()的任何其他调用,我们得到正式的问候而不是随意的问候。有道理。

然后我转向反思。我在这里发现了一个片段,似乎很有希望并且经过考验:

DartPad Example

导致错误The method 'greet' is not defined for the class 'EnglishCasual',我应该预料到,因为noSuchMethod未定义为静态,因此没有调用静态方法调用。所以,最后一次......

DartPad Example

我们收到另一个错误The name 'noSuchMethod' is already defined in 'core/object.dart'

在这一点上,我没有想法。似乎没有办法完成这个(看似简单的)练习,我真的希望你们能指出我正确的方向。

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

如你所说,静态方法不是继承的。这意味着只继承实例方法。 通过一次调用操作可以调用两个不同函数的唯一方法是:

  • 它正在调用实例方法(包括getter,setter和operator),或
  • 它正在调用一个函数值。

那是:

callA(o) => o.foo(42);  // Instance method.
callB(f) => f(42);  // Function value.

所有其他情况下,要静态确定要调用的函数,因此您将始终调用完全相同的函数。您不能让greet函数调用不同的函数,具体取决于它的调用方式,除非它是一个实例方法本身,或者它需要一个有助于它选择的参数。

换句话说,不要尝试使用静态函数做一些聪明的事情。 您正尝试将CasualEnglish版本的sayGreetingactGreeting 覆盖 English中的版本。只有当它们是实例成员时才能工作。

答案 1 :(得分:0)

静态方法不会在Dart中继承,也不能被覆盖等。

打开standard并搜索 10.7静态方法

答案 2 :(得分:0)

只需删除“静态”关键字 - 继承和覆盖将开始起作用,如dartpad所示。

我建议退一步看看面向对象编程(OOP)概念,幸运的是你可以使用Java OOP basics,因为Dart在这种情况下类似于基于类的面向对象语言。您还可以查看dart guru Seth Ladd以及更常见的Wikipedia所说的内容。