首页 > 解决方案 > 如何覆盖子类中的类变量?

问题描述

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

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

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

编辑:上层类的覆盖变量中的问题似乎是相同的,但答案显示在子类方法中使用超类变量,而我想要的是定义超类中的行为,并用 with 覆盖变量那些来自子类的。

标签: dart

解决方案


您不能覆盖类中的_x值,Bar因为Foo并且Bar位于不同的库中。

只需将Bar定义移动到foo.dartBar能够覆盖_x,因为现在它们都在同一个库中。

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

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

将多个类放在一个库中可以启用一些有用的模式。由于 Dart 中的隐私在库级别而不是类级别起作用,因此这是一种定义“朋友”类的方法,就像在 C++ 中一样。在同一个库中声明的每个类都可以访问彼此的私有成员,但该库之外的代码不能。


推荐阅读