Saya ingin membuat dek dari 16 kartu, dengan nomor masing-masing jenis kartu di dek.

Ini adalah solusi saya saat ini tetapi tidak terlihat bagus.

Bagaimana cara membuatnya lebih bersih dan membuatnya mengikuti Prinsip OOP.

Masing-masing bidak (penjaga, pendeta, dll) mewarisi dari Kelas Kartu.

Apakah tipe Generik sesuatu yang harus saya lihat di sini?

Kode gambar dengan format

 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#
0
Kamal 22 April 2021, 20:48

1 menjawab

Jawaban Terbaik

Ini akan menjadi penggunaan yang baik untuk implementasi pola pabrik.

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

Kemudian, ubah kelas Deck Anda untuk menggunakannya:

Dek kelas umum

{
    public readonly List<Card> Cards;
        
    public Deck(int numberOfGuards) // [numberOfPriests, etc]
    {
        // Guards
        Cards.AddRange(CardFactory<Guard>.BuildMany(numberOfGuards));

        // [...]
    }
}
0
Matthew M. 22 April 2021, 19:35