使用工厂方法创建子类对象
Posted
技术标签:
【中文标题】使用工厂方法创建子类对象【英文标题】:Create subclass object with factory method 【发布时间】:2014-02-24 16:08:46 【问题描述】:有一个我无法控制的 Gold 类。它有一个工厂方法:
public static Gold TransmuteFromLead(Lead someLead);
我现在将 Gold 子类化为我自己的 GoldWatch 类。我有一个 Lead 对象。有没有办法在 GoldWatch 中编写一个 TransmuteFromLead 方法,它以某种方式使用 Gold 的 TransmuteFromLead 方法但生成一个 GoldWatch 对象?
对于类似但不完全一样的问题,请参阅What's the correct alternative to static method inheritance? 但我的情况不同,因为我不控制基类。
【问题讨论】:
如果您在 GoldWatch 上有一个 GoldWatch CreateWatch(Gold someGold) 方法,您可以创建黄金然后创建手表。我想不出直接创建它的好方法。 尽管它偶尔会派上用场,但没有简单的方法。您必须手动从Lead
或Gold
创建转换。如果您还需要复制一些私有字段,这很可能是不可能的(以一种干净的方式)。核心问题是,尽管Gold
和GoldWatch
之间共享了一些数据,但它们最终是两个不同的对象。像他们的内存组织这样的东西是 JIT 编译器的一个实现细节,所以真的没有什么可参考的。如果你真的需要这样做,你可能不得不使用反射,它仍然会很棘手。
【参考方案1】:
您可以使用隐式运算符:
public static implicit operator GoldWatch(Gold g)
return new GoldWatch(g);
然后在GoldWatch
上添加一个构造函数以从Gold
对象初始化自身。
这将允许您这样做:
var goldWatch = (GoldWatch)TransmuteFromLead(someLead);
甚至这个:
GoldWatch goldWatch = TransmuteFromLead(someLead);
【讨论】:
【参考方案2】:对于 Gold 中的任何其他公共方法,您将它们包装在 GoldWatch 中,然后在 gold
实例上调用相同的方法。
class GoldWatch : Gold
Gold gold;
private GoldWatch(Gold gold)
this.gold = gold;
GoldWatch TransmuteFromLead(Lead someLead)
return new GoldWatch(Gold.TransmuteFromLead(someLead));
【讨论】:
以上是关于使用工厂方法创建子类对象的主要内容,如果未能解决你的问题,请参考以下文章