我对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()
使用的是_x
中定义的Foo
。
但是我很困惑如何从timesTwo()
继承Foo
方法,并让它使用Bar
中的private变量。
理想情况下,我将能够在基类中定义一组共享方法,然后覆盖子类中的值。
有人可以帮助我理解如何定义这些类关系,以便可以将私有的类变量与基类方法一起使用吗?
编辑:override variables of upper classes中的问题似乎相同,但是答案显示了在子类方法中使用超类变量,而我想要的是在超类中定义行为并覆盖变量以及子类中的变量。
答案 0 :(得分:1)
您无法覆盖_x
类中的Bar
值,因为Foo
和Bar
在不同的库中。
只需将Bar
的定义移至foo.dart
,Bar
就可以覆盖_x
,因为现在它们都在同一个库中。
允许在dart的单个文件中声明多个类。
将多个类放在一个库中可以启用一些有用的模式。由于Dart中的隐私权是在库级别而非类级别起作用的,因此这是一种定义“朋友”类的方法,就像在C ++中一样。在同一库中声明的每个类都可以访问彼此的私有成员,但是该库外部的代码无法访问。
答案 1 :(得分:0)
如先前答案中所述,无法从同一库外部覆盖私有变量。这是Dart处理私有变量和库的正确方法。
如果像我这样不适合您的用例,则可以考虑使用公共变量和mixin解决方案。对我来说看起来像这样:
在foo.dart
中将_x
更改为x
:
class Foo {
int x;
int timesTwo() {
return x * 2;
}
}
在_x
中将x
更改为extends
,并将with
更改为bar.dart
:
import 'foo.dart';
class Bar with Foo {
int x = 2;
}
这将允许在继承/混合方法中覆盖实例变量。但是您确实失去了“私人”因素。
注意:不需要with
关键字,但是在我的情况下,它使意图比extends
关键字更明确。 YMMV