gpt4 book ai didi

c# - 如何在子类的工厂方法中避免 switch-case

转载 作者:行者123 更新时间:2023-11-30 18:28:06 25 4
gpt4 key购买 nike

假设我们有一组类(卡片,为了它),我们需要根据一些标识符来实例化它们。工厂方法看起来像这样:

public Card GetCard(int cardNumber) 
{
switch(cardNumber)
{
case 13: return new King();
case 12: return new Queen();
case 11: return new Jack();
}

//...
}

我想要的是避免这个开关。为什么?也许我想在功能中重用这个比较。

我想出的是这样的:

private Dictionary<int, Type> cardTypes = 
{
{13, typeof(King)},
{12, typeof(Queen)},
{11, typeof(Jack)}
};

public Card GetCard(int cardNumber)
{
var cardType = cardTypes[cardNumber];
var instance = Activator.CreateInstance(cardType);
return (Card)instance;
}

但是,此解决方案使用昂贵的反射,并且当您有多个“标识符”时也会出现问题(例如 1 和 14 都给出 Ace - 我是否应该将 2 个键添加到字典?)。

这种情况下的最佳做法是什么?

最佳答案

您可以存储 Func<Card> 而不是将类型 存储在字典中:

private Dictionary<int, Func<Card>> cardFactories = 
{
{ 13, () => new King() },
// etc
}

public Card GetCard(int cardNumber)
{
var factory = cardFactories[cardNumber];
return factory();
}

对于卡片,我可能一开始就让它们不可变,然后只用卡片本身填充字典,但那是另一回事:)

关于c# - 如何在子类的工厂方法中避免 switch-case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25767040/

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