gpt4 book ai didi

oop - 在父类(super class)中实例化子类的一种方法

转载 作者:行者123 更新时间:2023-12-01 09:27:45 27 4
gpt4 key购买 nike

我有一个基础抽象类,它聚合了一个集合中的一堆项目:

abstract class AMyAbstract
{
List<string> Items { get; private set; }

public AMyAbstract(IEnumerable<string> items)
{
this.Items = new List<string>(items);
}
}

有很多子类,我们给它们命名Foo , Bar , Baz等。它们都是不可变的。现在我需要一个 merge()方法,它将合并 items像这样的两个对象:

abstract class AMyAbstract
{
// ...
public AMyAbstract merge(AMyAbstract other)
{
// how to implement???
}
}

Foo foo1 = new Foo(new string[] {"a", "b"});
Bar bar1 = new Bar(new string[] {"c", "d"});
Foo fooAndBar = foo1.merge(bar1);
// items in fooAndBar now contain: {"a", "b", "c", "d"}

由于对象是不可变的,merge()方法不应更改 items 的状态字段,但它应该返回调用它的类的新对象。我的问题是:如何明智地实现 merge()方法?

问题 1:AMyAbstract显然不知道子类的特定构造函数(依赖倒置原则),因此我不能(或者我可以?)在父类(super class)中创建子类的实例。

问题 2:实现 merge() 每个子类中的方法都是很多代码重复(DRY规则)。

问题 3:提取 merge()一个全新类的逻辑并不能解决 DRY 规则问题。即使使用访问者模式,也需要大量复制/粘贴。

上述问题排除了我在阅读 SOLID 之前可能对实现的任何想法。 . (从那以后我的生活一直很悲惨;)

或者是否有一种完全不同的、开箱即用的方法来实现这些对象的合并?

我希望能用 C#、Java 甚至 PHP 回答。

编辑:我想我遗漏了一条有效信息:事件虽然有很多不同的子类,但它们只能(应该)以两种方式构建,也许是三种方式(如单一责任原则的含义):

  • 无参数构造函数
  • 接受一个 IEnumerable<T> 的构造函数论据
  • 一个接受数组和其他修饰符的构造函数

这将使访问者模式重新回到标签上如果我可以对构造函数施加约束 - 例如通过在接口(interface)中定义构造函数。但这只有在 PHP 中才有可能。在 Java 或 C# 中,无法强制执行构造函数签名,因此我无法确定如何实例化子类。一般来说,这是一个很好的规则,因为我们永远无法预测子类的作者希望如何构造对象,但在这种特殊情况下,它可能会有所帮助。所以一个辅助问题是:我能以某种方式强制一个类的实例化方式吗?在这种简单的情况下,构建器模式听起来太过分了,是吗?

最佳答案

关于依赖倒置规则和代码重复问题,您是对的。

您可以在抽象类中编写合并逻辑的核心实现,并将创建新实例的任务交给派生类。在您的抽象类中创建一个抽象方法,该方法将强制所有子类实现它。目的是这个方法是创建一个类的新实例并返回它。父类(super class)将使用此方法获取新实例并进行合并。

生成的 java 代码将如下所示

abstract class AMyAbstract {
// ...
public AMyAbstract merge(AMyAbstract other) {
AMyAbstract obj = getNewInstance();
// Do the merge
// Return the merged object.
}

protected abstract AMyAbstract getNewInstance();
}

class foo extends AMyAbstract {
protected foo getNewInstance() {
// Instantiate Foo and return it.
}
}

希望这会有所帮助..

关于oop - 在父类(super class)中实例化子类的一种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20291253/

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