inheritance - 是否可以在构造函数中使用this.fieldname初始化基类中的字段?

标签 inheritance dart polymorphism

以下代码无效,因为无法从扩展this.base1的类的构造函数中初始化BaseClass:

abstract class BaseClass{
  String base1;
}

class MyClass extends BaseClass{
  int i1;
  MyClass(this.base1, this.i1);
}
一个人必须做
abstract class BaseClass{
  String base1;
  BaseClass(this.base1);
}

class MyClass extends BaseClass{
  int i1;  
  MyClass(String base1, this.i1) : super(base1);
}
要么
abstract class BaseClass{
  String base1;
}

class MyClass extends BaseClass{
  int i1;  
  MyClass(String base1, this.i1){
    this.base1 = base1; 
  }
}
使用mixin而不是抽象基类也不会允许我这样做。但是,我发现有一种方法-通过在实现类中重新声明该字段:
abstract class BaseClass{
  String base1;
}

class MyClass extends BaseClass{
  String base1;
  int i1;  
  MyClass(this.base1, this.i1);
}
这是标准做法,还是在执行此操作时应注意的陷阱?

最佳答案

您没有在子MyClass中重新声明父变量,而是在创建新变量。它们具有相同的名称,但是现在有两个单独的变量。

abstract class BaseClass{
  String base1;
}

class MyClass extends BaseClass{
  String base1;
  MyClass(this.base1){
    super.base1 = "A";
  }
  
  void foo(){
    print(base1 + " | " + super.base1);
  }
}


main(){
  (MyClass("B")).foo();
}
结果:
B | A
除此之外,如果有可能,对任何一个类进行任何更改都将非常脆弱。
现在,我将坚持您的第一个示例。如果您真的关心样板构造函数,那么我不会紧跟其后,但是在dart中对默认构造函数进行了一些工作,以潜在地消除那些可以从这样的简单类轻松推断出的构造函数。如果您有兴趣,可以搜索github问题。

关于inheritance - 是否可以在构造函数中使用this.fieldname初始化基类中的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63526869/

相关文章:

c++ - 单例混合 C++

C++,如何返回基类,然后将其转换为派生类?

Java 继承检查多个变量的值

c++ - 添加成员变量的子类构造

Scala、类层次结构和构造函数复制/粘贴

dart - 在 Dart 中将 ByteBuffer 快速复制到 ByteBuffer

javascript - dart 最新的 js-interop 库最近引起了一些问题

dart - Dart 式铸件

c++ - 没有调用析构函数?

c++ - 多态性还是属性字典?