gpt4 book ai didi

Javascript:如何在不创建循环依赖的情况下重用创建子实例的方法

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:25 25 4
gpt4 key购买 nike

abstract class Fruit {
private content: Fruit[] = [];

addChild() {
// Pick one at random (using this as an example instead of the actual criteria that determines this)
const type = pickOne(['apple', 'banana', 'cherry']);

switch (type) {
case 'apple':
this.content.push(new Apple());
case 'banana':
this.content.push(new Banana());
case 'cherry':
this.content.push(new Cherry());
}
}
}

class Apple extends Fruit { }

class Banana extends Fruit { }

class Cherry extends Fruit { }

如何在不创建循环依赖的情况下重构它,以便:

  1. 每个类都在一个单独的文件中
  2. addChild() 方法可用于所有 child ,无需复制代码

我读到过,基类了解有关子类的任何信息通常是一种糟糕的模式,但我不确定更好的模式会是什么样子。

Example that might make more sense

编辑:删除了作为参数的type

最佳答案

需要将抽象类从工厂类中分离出来(创建新实例):

// fruit.ts
abstract class Fruit {
private content: Array<Fruit> = [];

addChild(child: Fruit) {
this.content.push(child);
}
}

// fruit-factory.ts
class FruitFactory {
create(type: 'apple' | 'banana' | 'cherry'): Fruit {
switch (type) {
case 'apple':
return new Apple();
case 'banana':
return new Banana();
case 'cherry':
return new Cherry();
}
}
}

// apple.ts
class Apple extends Fruit { }

// banana.ts
class Banana extends Fruit { }

// cherry.ts
class Cherry extends Fruit { }

Factory design pattern有助于隔离和重用创建对象的代码。

在您更详细的示例中,loadChildren 不必绑定(bind)到 List 抽象类。这使得 List 抽象具有 3 个职责:作为列表、从外部源加载数据和创建新实体。

可维护代码的指导原则是 single responsibility principle每个类都有单一的职责。

我建议您根据确定的职责将 List 对象分成 3 个类:abstract class Listclass ListFactory类DataFetcher

这将允许您为这些类中的每一个定义一个好的接口(interface)。

关于Javascript:如何在不创建循环依赖的情况下重用创建子实例的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52248742/

25 4 0
文章推荐: typescript :对象和基元之间的 keyof typeof union 永远不会
文章推荐: java - FreeMarker 模板中处理错误的不同方法有哪些?
文章推荐: java - @Inject 和@PersistenceContext 有什么区别?
文章推荐: typescript - Angular 6 Reactive Forms - 根据条件动态设置