dart 如何使用工厂构造函数扩展抽象类?

ztigrdn8  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(108)

具体情况如下:

abstract class A {
  void doSomething() => print('Do something..');
}

class B implements A {
  @override
  void doSomething() => print('Do something already..');
}

class C extends A {
}

字符串
我有一个抽象类A。类B实现了A。因此它覆盖了doSomething()方法。类C扩展了A。
一切正常,直到我添加工厂构造函数到类A:

abstract class A {
  factory A() => new B();

  void doSomething() => print('Do something..');
}


这会导致我的IDE(IntelliJ IDEA)中出现错误:
需要生成构造函数,但找到工厂
我的第一个想法是为类C创建构造函数,在那里我将调用类A的工厂构造函数。
当我尝试扩展Exception类时,也遇到了同样的问题。它也有一个工厂构造函数:

abstract class Exception {
  factory Exception([var message]) => new _ExceptionImplementation(message);
}


这就是为什么要创建我的自定义异常,我必须实现Exception类,而不是扩展它,这真的让我很困惑。
我还想澄清一个术语问题。我是否可以说,从B类的Angular 来看,A是一个接口,因此B实现了接口A。但是,从C类的Angular 来看,A是一个抽象类,因此C扩展了抽象类A。这些说法正确吗?
谢谢
德米特里。

mbjcgjjk

mbjcgjjk1#

如果一个类没有构造函数,则隐式添加生成构造函数。如果一个类有显式构造函数,则不添加生成构造函数。您有两种选择。

  • 使工厂构造函数成为命名的工厂构造函数,并添加一个普通构造函数
abstract class A {
  void doSomething() => print('Do something..');
  factory A.name() => new B();
  A();
}

字符串

  • 或使普通构造函数命名并从扩展类显式调用它
abstract class A {
  void doSomething() => print('Do something..');
  factory A() => new B();
  A.protected();
}

class C extends A {
  C() : super.protected();
}


尝试DartPad
你的陈述是正确的。如果你实现一个类,它就像一个接口,如果你扩展它,它就像一个基类。

wbgh16ku

wbgh16ku2#

我不知道它是否有效,但它解决了我的问题。我知道有很多解决方案,这可能是这个解决方案最糟糕的。:)但我想与你分享
有时候后端API返回相同的模型,但是不同的值。像这样。

Map<String,dynamic> map1 = {
  "version": "2.16.0",
  "language_1":"Dart",
  "framework_1":"Flutter",
};

Map<String,dynamic> map2 = {
  "version" : "10.0.1",
  "language_2":"javaScript",
  "framework_2":"NodeJs",
};

字符串
我需要的D模型,所以从D扩展其他型号

class D{
  D({
    this.language,
    this.frameWork,
    this.version,
  });
  String? language;
  String? frameWork;
  String? version;
}


D扩展模型

class A extends D{
  A();
  
  factory A.fromJson(Map<String,dynamic> json) => C.fromJsonForA(json);

}

class B extends D{
  B();
  
 factory B.fromJson(Map<String,dynamic> json) => C.fromJsonForB(json);
}


并在其他类C中编写factory构造函数

class C extends D implements B,A{
  C({
    String? language,
    String? frameWork,
    String? version,
  }):super(
    language:language,
    frameWork:frameWork,
    version:version,
  );
  
  factory C.fromJsonForB(Map<String,dynamic> json){
    final c = C.protected(json);
    c.frameWork = json['framework_2'];
    c.language = json['language_2'];
    return c;
  }
  
  
  factory C.fromJsonForA(Map<String,dynamic> json){
    final c = C.protected(json);
    c.frameWork = json['framework_1'];
    c.language = json['language_1'];
    return c;
  }
  
  
  factory C.protected(Map<String,dynamic> json){
    return C(
      version: json["version"],
    );
  }
}


我用了:)

A modelA = A.fromJson(map1);
  B modelB = B.fromJson(map2);
class Example {
  Example._();
  
  static printModel(D model){
    print("${model.language} : ${model.frameWork} version : ${model.version}");
  }
}

的字符串

相关问题