c# - 如何让一个函数创建同一类的多个不同类型
问题描述
我想制作一副 16 张牌,每副牌都有一些牌。
这是我目前的解决方案,但看起来不太好。
我如何使它更干净并使其遵循 OOP 原则。
每个部分(守卫、牧师等)都继承自 Card 类。
我应该在这里查看通用类型吗?
class Deck
{
public List<Card> Cards;
int NumberofGuards = 5;
int NumberofPriests = 2;
int NumberofBarons = 2;
int NumberofMaids = 2;
int Numberofprinces = 2;
int NumberofKings = 1;
int NumberofCountesses = 1;
int NumberofPrincesses = 1;
public Deck()
{
//Guards
for (int i = 0; i < NumberofGuards; i++)
{
Cards.Add(new Guard());
}
//Priests
for (int i = 0; i < NumberofPriests; i++)
{
Cards.Add(new Priest());
}
//Barons
for (int i = 0; i < NumberofBarons; i++)
{
Cards.Add(new Baron());
}
//maids
for (int i = 0; i < NumberofMaids; i++)
{
Cards.Add(new Maid());
}
}
}
}
abstract class Card
{
public string Name { get; set; }
public int Number { get; set; }
public abstract void Keep();
public abstract void Discard();
public abstract void Use();
}
解决方案
这将是工厂模式实现的一个很好的用途。
public class CardFactory<T> where T : Card, new()
{
public static List<T> BuildMany(int count) {
var list = new List<T>();
for (int x=0; x<count; x++)
{
list.Add(new T());
}
return list;
}
}
然后,修改您的Deck
类以使用它:
公共课甲板
{
public readonly List<Card> Cards;
public Deck(int numberOfGuards) // [numberOfPriests, etc]
{
// Guards
Cards.AddRange(CardFactory<Guard>.BuildMany(numberOfGuards));
// [...]
}
}
推荐阅读
- php - $_SESSION 启用内容 - PHP
- c# - What is the complexity of a `continue` statement?
- typescript - 如何在 TypeScript 的嵌套对象中使用函数参数类型键入函数参数?
- azure - 模糊搜索行为比预期更严格
- jhipster - 插件 [id: 'com.google.cloud.tools.jib', version: '0.9.11'] 未找到
- python - 如何更改散景中箭头线的颜色?
- arduino - 使用 arduino 读取 RFID
- android - 如何在不触发其他意图的情况下使用 getIntent()?
- php - PHP 7.3 PDO 试图获取非对象的属性
- functional-programming - 我在第一个成员中遇到错误(第二行代码)