Avi*_*Avi 18 c# factory casting factory-pattern
C#工厂模式是否需要向上转换?
我希望上课在图书馆G中在班级图书馆A中创造一个亚当,而不使G依赖于A.上帝在班级图书馆E中为夏娃制作亚当斯,夏娃可以知道并依赖亚当.(编辑 - 这个样本越来越好:)
我能想到的解决方案是在A中有一个AdamFactory.这样AdamFactory知道Adam并且可以很容易地创建它(可能只是调用Adam的构造函数).上帝收到一个AdamFactory,可以命令CreateAdam.
现在,因为上帝不被允许认识亚当,AdamFacotry的CreateAdam必须返回一个物体,这需要Eve将AdamFactory返回的物体向上投射到亚当身上.
我认为这会奏效.然而,我对上传感到不安,因为这是禁忌.这真的是必须的吗?
PS - 没有Blasphemy的意图,如果某人的感受受到伤害我会道歉.使用上帝和亚当而不是创造者和创造似乎更好,因为后两个词彼此太相似了.
编辑:重新接口建议.让我们假设Adam有两种方法:ProvideLove,ProvideFood和ProvideProtection(我们保持这个样本是kis-safe :).夏娃将亚当用于这两个目的,但当然上帝没有.那么为什么要向上帝提供AdamFactor返回实现IAdam而不仅仅是对象的东西的知识呢?我不明白!
编辑:工作代码(同一个库中的每个人,我的目标是分离到不同的库)看起来像这样:
Adam God.LoadAdam(AdamID theAdamID)
var adam = new Adam(theAdamId, this)
Adam.Adam(AdamID theAdamID, God theGod)
_god = theGod
_mind = theGod.LoadMind(theAdamId, this)
Mind God.LoadMind (AdamID theAdamID, Adam theAdam)
var mind = new Mind (theAdam)
var mindId = new minId(theAdamId)
mind.DeserializeFromFile(minId)
Mind.Mind (Adam theAdam)
_adam = theAdam
Run Code Online (Sandbox Code Playgroud)
我不确定我是否完全理解这些要求,但这里有一个建议:
//in assembly G
public abstract class HumanFactory<T>
{
public abstract T CreateHuman();
}
//in assembly A
public class Adam { }
//in assembly A
public class AdamFactory : HumanFactory<Adam>
{
public override Adam CreateHuman()
{
return new Adam();
}
}
//in assembly G
public class God
{
public T Create<T>(HumanFactory<T> factory)
{
return factory.CreateHuman();
}
}
Run Code Online (Sandbox Code Playgroud)
和用法:
//Somewhere in assembly E
Adam adam = new God().Create(new AdamFactory());
Run Code Online (Sandbox Code Playgroud)