如何在 DART 语言中初始化超类变量



简单地说,我必须对子类和父类进行类
我是Dart语言的新手,我需要从子类分配超类属性

这是超类结构

class Trip{
  final int id;
  final String title;
  final double price;
  Trip({this.id,this.title,this.price});
}

这是儿童班

class FullTrip extends Trip{
  final String data;
  FullTrip({this.data}) : super(id:id,title:title,price:price);
}

确定这根本不起作用
问题是:如何从 FullTrip 初始化实例并为 FullTrip 和 Trip(超级类)传递变量
提前致谢

您需要在

子类中重复参数。

class FullTrip extends Trip{
  final String data;
  FullTrip({this.data, int id, String title, double price}) : super(id:id,title:title,price:price);
}

有关于减少构造函数的此类样板的讨论,但据我所知,还没有决定。

User super-parameters ,这是在 Dart 2.17 中添加的。例如,假设这是您的类:

class Parent {
  Parent({
    int? i,
    bool b = false,
    required String s,
  });
}

旧方式(样板代码)

早些时候,您必须执行以下操作:

class Child extends Parent {
  Child({
    int? i,
    bool b = false,
    required String s,
  }) : super(
          i: i,
          b: b,
          s: s,
        );
}

新方式(整洁干净)

但是现在您可以摆脱那些样板代码。

class Child extends Parent {
  Child({
    super.i, 
    super.b = false,
    required super.s,
  });
}

如果要在编译之前在子类中重新初始化扩展或实现的上层类的非私有变量,只需使用 @override .看看这个例子

(如果您想尝试该代码,请记住它支持 null 安全性。如果您的测试没有,只需删除?符号即可。

class Go {
  String? name = "No name";
}
class Foo implements Go { //use either implements or extends
  @override
  String? name = "Foo";
}
class Doo extends Go { //use either implements or extends
  @override
  String? name = "Doo";
}

用例示例:在上面的代码中,您可以看到在我们的上层类中,我们有这个String name变量。然后在子类中,我们可以简单地覆盖该变量。之后,在 main 中,我们现在可以做一些事情,例如 遍历List<Go> ,访问我们想要的内容,然后触发某些内容,例如打印名称:

void main() {
  
  List<Go> foos = [
    Go(),
    Foo(),
    Doo(),
  ];
  
  for(Go x in foos){
    print(x.name);
  }
}

输出:

No name
Foo
Doo

如果您使用 extendsimplements 关键字,则此方法有效。

最新更新