C# 使用工厂方法创建子类对象

C# 使用工厂方法创建子类对象,c#,.net,factory,C#,.net,Factory,有一门课是我无法控制的。它有一个工厂方法: public static Gold TransmuteFromLead(Lead someLead); 我现在将Gold子类化,以制作我自己的类GoldWatch。我有一个引导对象。有没有一种方法可以在GoldWatch中编写一个TransmuteFromLead方法,以某种方式使用Gold的TransmuteFromLead方法,但生成一个GoldWatch对象 对于类似但不完全相同的问题,请参见但我的情况不同,因为我不控制基类。您可以使用隐式运

有一门课是我无法控制的。它有一个工厂方法:

public static Gold TransmuteFromLead(Lead someLead);
我现在将Gold子类化,以制作我自己的类GoldWatch。我有一个引导对象。有没有一种方法可以在GoldWatch中编写一个TransmuteFromLead方法,以某种方式使用Gold的TransmuteFromLead方法,但生成一个GoldWatch对象


对于类似但不完全相同的问题,请参见但我的情况不同,因为我不控制基类。

您可以使用隐式运算符:

public static implicit operator GoldWatch(Gold g)
{
    return new GoldWatch(g);
}
然后在GoldWatch上添加一个构造函数,从一个Gold对象启动它自己

这将允许您执行以下操作:

var goldWatch = (GoldWatch)TransmuteFromLead(someLead);
甚至这个:

GoldWatch goldWatch = TransmuteFromLead(someLead);

您可以使用隐式运算符:

public static implicit operator GoldWatch(Gold g)
{
    return new GoldWatch(g);
}
然后在GoldWatch上添加一个构造函数,从一个Gold对象启动它自己

这将允许您执行以下操作:

var goldWatch = (GoldWatch)TransmuteFromLead(someLead);
甚至这个:

GoldWatch goldWatch = TransmuteFromLead(someLead);

对于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));
    }
}

对于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));
    }
}

如果您在GoldWatch上有一个GoldWatch CreateWatchGold someGold方法,您可以先创建黄金,然后再创建手表。我想不出一个直接创建它的好方法。即使它偶尔会很方便,也没有简单的方法。您必须手动从Lead或Gold创建转换。如果您还需要复制一些私有字段,那么以干净的方式很可能不可能做到这一点。核心问题是,尽管一些数据在Gold和GoldWatch之间共享,但最终它们是两个不同的对象。内存组织之类的东西是JIT编译器的一个实现细节,所以实际上没有什么可以参考的。如果你真的需要这样做,你可能必须使用反射,这仍然是很棘手的。如果你在GoldWatch上有一个GoldWatch CreateWatchGold someGold方法,你可以先创建黄金,然后再创建手表。我想不出一个直接创建它的好方法。即使它偶尔会很方便,也没有简单的方法。您必须手动从Lead或Gold创建转换。如果您还需要复制一些私有字段,那么以干净的方式很可能不可能做到这一点。核心问题是,尽管一些数据在Gold和GoldWatch之间共享,但最终它们是两个不同的对象。内存组织之类的东西是JIT编译器的一个实现细节,所以实际上没有什么可以参考的。如果您真的需要这样做,您可能必须使用反射,而且这仍然很棘手。