避免在 Dart 中继承类

Mik*_*rer 5 dart

有没有办法避免 Dart 中的继承?我正在寻找类似的东西

final class MyJavaClass {
    ...
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ioP 7

不直接,不。

您可以使用私有构造函数编写一个类并通过静态方法访问它们:

class MyFinalClass {
  MyFinalClass._ctor1() {}
  MyFinalClass._ctor2(String param1, String param2) {}
  static MyFinalClass getInstance() {
    return new MyFinalClass._ctor1();
  }
  static MyFinalClass getInstanceWithParams(String param1, String param2) {
    return new MyFinalClass._ctor2(param1, param2);
  }
}
Run Code Online (Sandbox Code Playgroud)

但这有多个问题:

  • 同一个库中的类仍然可以继承它——Dart 中的可见性适用于库,而不是单个类。
  • 这是很多代码,随着构造函数的数量而缩放。
  • 它引入了许多静态方法,它们都必须以不同的方式命名。
  • 当然,您不能使用new关键字在其库之外实例化该类。
  • 这只会阻止类的扩展。实现“final”类仍然是可能的。

最终,这些是此功能的许多缺点。是否真的值得由你来决定。

编辑

与我之前写的相反,工厂构造函数也可以工作,消除“无法用new关键字实例化”的缺点。

class MyFinalClass {
  factory MyFinalClass.ctor1() {}
  factory MyFinalClass.ctor2(String param1, String param2) {}
  void method1() {}
  void method2() {}
}
Run Code Online (Sandbox Code Playgroud)

另外,为了说明为什么实现非最终类的能力是一个大问题:

class Sub implements MyFinalClass {
  MyFinalClass _d;
  Sub.ctor1() {
    _d = new MyFinalClass.ctor1();
  }
  Sub.ctor2(String p1, String p2) {
    _d = new MyFinalClass.ctor2(p1,p2);
  }
  void method1() => _d.method1();
  void method2() {
    // do something completely different
  }
}
Run Code Online (Sandbox Code Playgroud)

这种伪子类化也适用于静态方法变体。