gpt4 book ai didi

Dart - 试图理解 'factory' 构造函数的值

转载 作者:行者123 更新时间:2023-12-04 16:39:41 24 4
gpt4 key购买 nike

如果我理解正确:

"A factory constructor affords an abstract class to be 
instantiated by another class, despite being abstract."

例如:

abstract class Animal {
String makeNoise(String sound);
String chooseColor(String color);
factory Animal() => new Cat();
}

class Cat implements Animal {
String makeNoise(String noise) => noise;
String chooseColor(color) => color;
}

以上允许我这样做:

Cat cat = new Animal();
var catSound = cat.makeNoise('Meow');
var catColor = cat.chooseColor('black');
print(catSound); // Meow

它还阻止我这样做:

class Dog implements Animal {
int age;
String makeNoise(String noise) => noise;
String chooseColor(color) => color;
}

Dog dog = new Animal(); // <-- Not allowed because of the factory constructor

所以如果我对这一切都是正确的,我会问为什么动物的额外代码?

如果您打算使用仅创建猫的动物的工厂构造函数,为什么不使用具有所需方法/属性的 Cat 类呢?

或者,动物类的目的是像上面那样的工厂构造函数, 真的是专门为 Cat 类设计的接口(interface)吗?

最佳答案

我不认为 factory 中的问题.

您的代码最初是错误的。

查看此代码并得出结论。

Locomotive locomotive = new SomethingWithSmokeFromChimney();

现在看看这段代码。

Plant plant = new SomethingWithSmokeFromChimney();

你错误地认为地球上所有的动物(甚至狗)都是猫。

Cat cat = new Animal();

如果你想要这个。

Cat cat = new Animal();
Dog dog = new Animal();

然后(如果我正确理解你的话)你也想要这个。

// Cat cat = new Animal();
// Dog dog = new Animal();
Dog dog = new Cat();

附言

相同的错误结论,但没有 factory .

void main() {
Cat cat = new Animal();
Dog dog = new Animal();
}

class Animal {
}

class Cat implements Animal {
}

class Dog implements Animal {
}

但是这个代码(取决于文档)可能被认为是正确的。

void main() {
Cat cat = new Animal("cat");
Dog dog = new Animal("dog");
}

abstract class Animal {
factory Animal(String type) {
switch(type) {
case "cat":
return new Cat();
case "dog":
return new Dog();
default:
throw "The '$type' is not an animal";
}
}
}

class Cat implements Animal {
}

class Dog implements Animal {
}

抽象类的工厂构造函数可以(默认)返​​回这个抽象类的一些默认实现。

abstract class Future<T> {
factory Future(computation()) {
_Future result = new _Future<T>();
Timer.run(() {
try {
result._complete(computation());
} catch (e, s) {
result._completeError(e, s);
}
});
return result;
}
}

关于Dart - 试图理解 'factory' 构造函数的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22437072/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com