首页 > 解决方案 > 如何让一个函数创建同一类的多个不同类型

问题描述

我想制作一副 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();
}

标签: c#

解决方案


这将是工厂模式实现的一个很好的用途。

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));

        // [...]
    }
}

推荐阅读