【问题标题】:Does extending an abstract class in Dart give the subclass another constructor在 Dart 中扩展抽象类是否会给子类另一个构造函数
【发布时间】:2021-02-05 09:11:29
【问题描述】:

我创建了一个带有最终变量的抽象类,因为我需要在其中创建一个构造函数来实例化变量。这个构造函数会被添加到所有扩展抽象类的类中吗?我不这么认为,因为我的一些子类将具有需要实例化的额外最终变量。如果是这种情况,抽象类的构造函数起什么作用?

供参考:

abstract class SuperClass {
  final String item
  SuperClass(item)
  : item = item;
}

class SubClass { 
  final String item
  final String item2
  SubClass(item, item2)
  : item = item,
  item2 = item2;
}

在这种情况下扩展最好的选择,如果是,超类的构造函数会被看到吗?

【问题讨论】:

    标签: oop dart abstract-class


    【解决方案1】:

    您的抽象类只是一个普通类,因为它没有任何抽象属性/方法。您唯一不能做的就是创建该抽象类的实例。 扩展 SuperClass 是有意义的,因为您将不再需要定义在超类中声明的字段,例如“item”字段。

    为了从中受益,您需要编写您的子类略有不同:

    abstract class SuperClass {
      final String item;
      SuperClass(this.item);
    }
    
    class SubClass extends SuperClass {
      final String item2;
      SubClass(String item, this.item2) : super(item);
    }
    

    请注意,子类构造函数调用超类的构造函数并将项目值传递给它。不过,您仍然必须在子类的构造函数中声明项目值;否则,您将没有机会初始化它,这是必需的,因为它在超类中是最终的。

    【讨论】:

    • 是的,这也解释了超类构造函数的目的。所以它不一定在子类中创建一个新的构造函数,我只需要确保在某个时候调用超类的构造函数。太棒了,谢谢。
    • @joshpetit,感谢您的编辑。我想明确一点,您仍然需要在子类中具有构造函数。因为调用超级构造函数的唯一地方是子类的构造函数,你必须调用超级构造函数。
    • 是的,我明白了,谢谢!我想知道只有一个字段的同一个构造函数是否会被传递给子类,但它不像你展示的那样,我们只需要确保按照你所说的调用超类。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-09-13
    • 2018-09-26
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多