我对Dart很陌生,在某些类继承方面遇到了麻烦。我想知道如何正确覆盖子类中的类变量。
这是一个一般性的语言问题。我主要来自Python背景,我想我只是缺少了一些核心的Dart概念。
下面是我要找的一般情况:
我有一个基类Foo,它定义了一些类变量和方法。变量名对于Foo的所有子类都是通用的,并且这些方法是常见的行为。
基本上,我想做的是:
在foo.dart中
class Foo {
int _x;
int timesTwo() {
return _x * 2;
}
}然后在bar.dart
import 'foo.dart';
class Bar extends Foo {
int _x = 2;
}然后在main.dart
import 'bar.dart';
main() {
Bar b = Bar();
print(b.timesTwo()); // NoSuchMethodError: The method '*' was called on null.
}我尝试过static、final、_等的各种组合。如果我将所有变量都公开,它确实有效,但这并不理想。
我知道_x变量是私有的,对它的访问仅限于文件。因此,timesTwo()正在使用Foo中定义的(或实际上未定义的) _x。
但是,我很困惑如何从timesTwo()继承Foo方法,并让它在Bar中使用私有变量。
理想情况下,我可以在基类中定义共享方法的集合,然后重写子类中的值。
有人能帮我理解如何定义这些类关系吗?这样我就可以在基类方法中使用私有类变量了吗?
编辑:override variables of upper classes中的问题似乎是相同的,但答案显示在子类方法中使用超类变量,而我想要的是定义超类中的行为,并用子类中的变量覆盖其中的变量。
发布于 2019-05-16 07:01:30
不能在Bar类中重写Bar值,因为Foo和Bar位于不同的库中。
只要将Bar定义移到foo.dart,Bar就可以覆盖_x,因为它们现在都在同一个目录中。
允许在一个文件中以dart格式声明多个类。
将多个类放在一个库中可以启用一些有用的模式。由于Dart中的隐私工作在库级别,而不是类级别,所以这是一种定义“朋友”类的方法,就像在C++中一样。在同一个库中声明的每个类都可以访问对方的私有成员,但该库之外的代码不能。
发布于 2019-05-17 02:11:03
不可能覆盖来自同一个库之外的私有变量,就像在前面的答案中发布的那样。这是处理私有变量和库的正确的Dart方法。
如果这不适合您的用例,像我一样,您可以考虑使用公共变量和混合解决方案。对我来说是这样的:
在foo.dart中,将_x改为x
class Foo {
int x;
int timesTwo() {
return x * 2;
}
}并将_x改为x,将extends更改为bar.dart中的with。
import 'foo.dart';
class Bar with Foo {
int x = 2;
}这将允许在继承/混合方法中重写实例变量。但你确实失去了“私人”因素。
注意:-- with关键字不是必要的,但在我的示例中,它使意图比extends关键字更加明确。YMMV
发布于 2021-08-13 21:48:14
如果要在子类中重新初始化扩展或实现的上层类的非私有变量,请参阅下面的示例。
https://stackoverflow.com/questions/56160550
复制相似问题