如何覆盖子类中的类变量?

时间:2019-05-16 03:50:40

标签: dart

我对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.
}

我尝试了staticfinal_等的各种组合。如果我将所有变量都公开,这确实有用,但这并不理想。

我知道_x变量是私有的,对其的访问仅限于文件。因此timesTwo()使用的是_x中定义的Foo

但是我很困惑如何从timesTwo()继承Foo方法,并让它使用Bar中的private变量。

理想情况下,我将能够在基类中定义一组共享方法,然后覆盖子类中的值。

有人可以帮助我理解如何定义这些类关系,以便可以将私有的类变量与基类方法一起使用吗?

编辑:override variables of upper classes中的问题似乎相同,但是答案显示了在子类方法中使用超类变量,而我想要的是在超类中定义行为并覆盖变量以及子类中的变量。

2 个答案:

答案 0 :(得分:1)

您无法覆盖_x类中的Bar值,因为FooBar在不同的库中。

只需将Bar的定义移至foo.dartBar就可以覆盖_x,因为现在它们都在同一个库中。

允许在dart的单个文件中声明多个类。

https://dart.dev/guides/language/effective-dart/design#consider-declaring-multiple-classes-in-the-same-library

  

将多个类放在一个库中可以启用一些有用的模式。由于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