我对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文档,它是预期的行为,因为静态方法不是继承的(这对我来说似乎很奇怪,但是好的。继续...)
然后我尝试了一个简单的代理到父类......
但这会产生另一个错误:Invalid context for 'super' invocation
或'super' is only available in instance methods
。好的......让我们按名称显式调用父类。
但是,正如预期的那样,这被视为对English.greet()
的任何其他调用,我们得到正式的问候而不是随意的问候。有道理。
然后我转向反思。我在这里发现了一个片段,似乎很有希望并且经过考验:
导致错误The method 'greet' is not defined for the class 'EnglishCasual'
,我应该预料到,因为noSuchMethod
未定义为静态,因此没有调用静态方法调用。所以,最后一次......
我们收到另一个错误The name 'noSuchMethod' is already defined in 'core/object.dart'
。
在这一点上,我没有想法。似乎没有办法完成这个(看似简单的)练习,我真的希望你们能指出我正确的方向。
这样做的正确方法是什么?
答案 0 :(得分:1)
如你所说,静态方法不是继承的。这意味着只继承实例方法。 通过一次调用操作可以调用两个不同函数的唯一方法是:
那是:
callA(o) => o.foo(42); // Instance method.
callB(f) => f(42); // Function value.
在所有其他情况下,要静态确定要调用的函数,因此您将始终调用完全相同的函数。您不能让greet
函数调用不同的函数,具体取决于它的调用方式,除非它是一个实例方法本身,或者它需要一个有助于它选择的参数。
换句话说,不要尝试使用静态函数做一些聪明的事情。
您正尝试将CasualEnglish
版本的sayGreeting
和actGreeting
覆盖 English
中的版本。只有当它们是实例成员时才能工作。
答案 1 :(得分:0)
静态方法不会在Dart中继承,也不能被覆盖等。
打开standard并搜索 10.7静态方法。
答案 2 :(得分:0)
只需删除“静态”关键字 - 继承和覆盖将开始起作用,如dartpad所示。
我建议退一步看看面向对象编程(OOP)概念,幸运的是你可以使用Java OOP basics,因为Dart在这种情况下类似于基于类的面向对象语言。您还可以查看dart guru Seth Ladd以及更常见的Wikipedia所说的内容。