Avoid Class Inheritance in Dart

Is there a way to avoid inheritance in Dart? I'm looking for something like

final class MyJavaClass {
    ...
}
+3
source share
3 answers

Not directly, no.

You can write a class with private constructors and access them using static methods:

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

But this has several problems:

  • Classes within the same library can still be subclassed - visibility in Dart applies to libraries, not individual classes.
  • This is a lot of code that scales with the number of constructors.
  • He introduces many static methods that should all be named differently.
  • And, of course, you cannot create an instance of a class outside its library using the keyword new.
  • . "" - .

, . , .

, , factory , " new ".

class MyFinalClass {
  factory MyFinalClass.ctor1() {}
  factory MyFinalClass.ctor2(String param1, String param2) {}
  void method1() {}
  void method2() {}
}

, , :

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

- .

+4

.

class MyJavaClass {
  MyJavaClass._private();
}
+1
import 'dart:mirrors';

class Final {
  Final() {
    InstanceMirror im = reflect(this);
    if (im.type.reflectedType != Final) throw "Final can't be inherited";
  }
}

class ExtendsFinal extends Final {}
//class WithFinal extends Object with Final{} //mixin can't declare constructor

void main() {
  new ExtendsFinal(); // ExtendsFinal !=  Final
}

If something implements your last class, this is not a problem, because it does not inherit the + logic, it is really useful for testing and injecting dependencies.

0
source

All Articles