【问题标题】:Is it possible to use this.fieldname in a constructor to initialize a field in a base class?是否可以在构造函数中使用 this.fieldname 来初始化基类中的字段?
【发布时间】:2020-12-11 01:50:40
【问题描述】:

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

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);
}

这是标准做法吗,或者在这样做时应该注意哪些陷阱?

【问题讨论】:

    标签: inheritance dart polymorphism


    【解决方案1】:

    您不是在子 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 issue。

    【讨论】:

    • 感谢您指出 super.base1 != this.base1!我实际上以为我已经对其进行了测试并确认了相反的结果,但事实证明我正在使用super.toString() 对其进行测试,实现为toString() => base1。但事实证明,that base1 指的是子类(我隐约记得多年前在其他语言中也曾与之搏斗)。我将坚持使用显式的超级初始化程序,以免将来让自己头疼……
    【解决方案2】:

    我认为重新声明是相当普遍的,尽管您应该启用annotate_overrides 分析选项并使用@override 以便分析器可以检测到基类中的名称是否更改。

    请注意,重新声明会创建一个新变量,该变量会覆盖基类中相应的 getter 和 setter。如果您愿意,您也可以在抽象基类中声明一个 getter 和 setter,并依靠实现来提供数据成员。

    【讨论】:

      猜你喜欢
      • 2019-01-21
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多