gpt4 book ai didi

inheritance - 如何正确代理 "inherited"静态方法?

转载 作者:行者123 更新时间:2023-12-03 03:02:14 29 4
gpt4 key购买 nike

我是 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() 的任何其他调用,我们得到了正式的问候而不是随意的问候。有道理。

然后我转向反射(reflection)。我在 SO 上找到了一个看起来很有前途的片段并对其进行了测试:

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'

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

正确的做法是什么?

最佳答案

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

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

即:

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

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

换句话说,不要尝试用静态函数做一些聪明的事情。您正在尝试使用 CasualEnglish 版本的 sayGreetingactGreeting override English。这只有在它们是实例成员时才有效。

关于inheritance - 如何正确代理 "inherited"静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40093937/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com