Dart 什么';MapEntry类中工厂构造函数的好处是什么?

Dart 什么';MapEntry类中工厂构造函数的好处是什么?,dart,Dart,原始代码 类映射条目{ 最终K键; 最终V值; 常量工厂映射项(K键,V值)=映射项; 常量映射项.u(this.key,this.value); } 当您可以简单地拥有以下内容时,需要创建上述工厂构造函数: 类映射条目{ 最终K键; 最终V值; 常量映射项(this.key,this.value); } 这样编写构造函数实际上使类成为最终类(类无法从此类扩展)。只能使用生成构造函数调用super()。这与不能以这种方式使用的工厂构造函数相反。由于唯一的生成构造函数是名为\uuu的私有构造函数

原始代码

类映射条目{
最终K键;
最终V值;
常量工厂映射项(K键,V值)=映射项;
常量映射项.u(this.key,this.value);
}
当您可以简单地拥有以下内容时,需要创建上述
工厂
构造函数:

类映射条目{
最终K键;
最终V值;
常量映射项(this.key,this.value);
}

这样编写构造函数实际上使类成为最终类(类无法从此类扩展)。只能使用生成构造函数调用
super()
。这与不能以这种方式使用的工厂构造函数相反。由于唯一的生成构造函数是名为
\uuu
的私有构造函数,因此无法进行扩展。需要注意的是,同一包中的类可以扩展该类,因为同一包中的类可以使用私有成员

通过使用工厂构造函数,即使默认构造函数是私有的,仍然可以创建
MapEntry
的实例

class MapEntry<K, V> {
  final K key;
  final V value;
  const factory MapEntry(K key, V value) = MapEntry<K, V>._;
  const MapEntry._(this.key, this.value);
  
}

class ExtendableMapEntry<K, V> {
  final K key;
  final V value;
  const ExtendableMapEntry(this.key, this.value);  
}


// ---------------

class GoodChild extends ExtendableMapEntry<int, int>{
  GoodChild(int i):super(i,i);
}

// Error:
// The constructor 'MapEntry<int, int> MapEntry(int key, int value)' is a
// factory constructor, but must be a generative constructor to be a valid
// superinitializer - line 24
class ImpossibleChild extends MapEntry<int, int>{
  ImpossibleChild(int i):super(i,i);
}
类映射条目{
最终K键;
最终V值;
常量工厂映射项(K键,V值)=映射项;
常量映射项.u(this.key,this.value);
}
类可扩展性{
最终K键;
最终V值;
const ExtendableMapEntry(this.key,this.value);
}
// ---------------
类GoodChild扩展了ExtendableMapEntry{
好孩子(int i):超级(i,i);
}
//错误:
//构造函数“MapEntry MapEntry(int键,int值)”是一个
//工厂构造函数,但必须是生成构造函数才能成为有效的
//超级初始化器-第24行
类imposibleChild扩展了MapEntry{
不可能子(inti):超级(i,i);
}

谢谢!!!虽然我没有得到你的
,但只有生成构造函数可以用来调用super()
。即使我的子类中有一个工厂构造函数,我也无法在其中调用
super
。该注释不是指如何在子类中调用super,而是指可以调用父类中的哪些构造函数。不能使用工厂构造函数实例化超类。这是不允许的,因为工厂构造函数可能返回许多不是该类的新实例的东西(一个预先存在的实例,如单例或子类的实例)。是的,这就解释了。因此,基本上我们不能在子类中使用
super
调用父类的工厂构造函数。这是正确的。