以下代码无效,因为无法从扩展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/