如何解决是否可以在构造函数中使用this.fieldname初始化基类中的字段?
以下代码无效,因为无法从扩展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问题。
,我认为重声明相当普遍,尽管您应该启用annotate_overrides
分析选项并使用@override
,以便分析器可以检测基类中的名称是否更改。
请注意,重新声明将创建一个新变量,该变量将覆盖基类中的相应getter和setter。如果愿意,还可以在抽象基类中声明一个getter和setter并依靠实现来提供数据成员。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。