gpt4 book ai didi

C# 工厂 - upcast 是必须的吗?

转载 作者:IT王子 更新时间:2023-10-29 04:50:14 29 4
gpt4 key购买 nike

C# 工厂模式是否需要向上转型?

我希望类库 G 中的上帝在类库 A 中创建一个亚当,而不是让 G 依赖于 A。上帝产生亚当供类库 E 中的夏娃消费,夏娃知道并依赖亚当是可以的。(编辑 - 这个示例越来越好:)

我能想到的解决方案是在 A 中有一个 AdamFactory。这样 AdamFactory 就知道 Adam 并且可以轻松地创建它(可能只需调用 Adam 的构造函数)。上帝收到一个 AdamFactory 并可以命令它创建 Adam。

现在,因为不允许上帝知道 Adam,AdamFacotry 的 CreateAdam 必须返回一个对象,这需要 Eve 将 AdamFactory 返回的对象向上转换为 Adam。

我认为这会奏效。但是,我对向上转型感到不安,因为这是一个禁忌。这真的是必须的吗?

附言- 无意亵渎,如果有人的感情受到伤害,我深表歉意。使用 God 和 Adam 而不是 Creator 和 Created 似乎更好,因为后两个词彼此太相似了。

编辑:重新接口(interface)建议。假设 Adam 有两种方法:ProvideLove、ProvideFood 和 ProvideProtection(我们确保此示例安全无虞:)。夏娃为了这两个目的使用亚当,但上帝当然没有。那么,为什么要向上帝提供 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

最佳答案

我不确定我是否完全理解这些要求,但这里有一个建议:


//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();
}
}

和用法:


//Somewhere in assembly E
Adam adam = new God().Create(new AdamFactory());

关于C# 工厂 - upcast 是必须的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4872304/

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