首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何覆盖子类中的类变量?

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

Stack Overflow用户
提问于 2019-05-16 03:50:39
回答 3查看 2.6K关注 0票数 2

我对Dart很陌生,在某些类继承方面遇到了麻烦。我想知道如何正确覆盖子类中的类变量。

这是一个一般性的语言问题。我主要来自Python背景,我想我只是缺少了一些核心的Dart概念。

下面是我要找的一般情况:

我有一个基类Foo,它定义了一些类变量和方法。变量名对于Foo的所有子类都是通用的,并且这些方法是常见的行为。

基本上,我想做的是:

foo.dart

代码语言:javascript
复制
class Foo {
  int _x;

  int timesTwo() {
    return _x * 2;
  }
}

然后在bar.dart

代码语言:javascript
复制
import 'foo.dart';

class Bar extends Foo {
  int _x = 2;
}

然后在main.dart

代码语言:javascript
复制
import 'bar.dart';

main() {
  Bar b = Bar();
  print(b.timesTwo()); // NoSuchMethodError: The method '*' was called on null.
}

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

我知道_x变量是私有的,对它的访问仅限于文件。因此,timesTwo()正在使用Foo中定义的(或实际上未定义的) _x

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

理想情况下,我可以在基类中定义共享方法的集合,然后重写子类中的值。

有人能帮我理解如何定义这些类关系吗?这样我就可以在基类方法中使用私有类变量了吗?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-16 07:01:30

不能在Bar类中重写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
EN

Stack Overflow用户

发布于 2019-05-17 02:11:03

不可能覆盖来自同一个库之外的私有变量,就像在前面的答案中发布的那样。这是处理私有变量和库的正确的Dart方法。

如果这不适合您的用例,像我一样,您可以考虑使用公共变量和混合解决方案。对我来说是这样的:

foo.dart中,将_x改为x

代码语言:javascript
复制
class Foo {
  int x;

  int timesTwo() {
    return x * 2;
  }
}

并将_x改为x,将extends更改为bar.dart中的with

代码语言:javascript
复制
import 'foo.dart';

class Bar with Foo {
  int x = 2;
}

这将允许在继承/混合方法中重写实例变量。但你确实失去了“私人”因素。

注意:-- with关键字不是必要的,但在我的示例中,它使意图比extends关键字更加明确。YMMV

票数 1
EN

Stack Overflow用户

发布于 2021-08-13 21:48:14

如果要在子类中重新初始化扩展或实现的上层类的非私有变量,请参阅下面的示例。

https://stackoverflow.com/a/68778696/13766744

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56160550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档