C # Как кодировать метод класса, который может быть вызван на экземпляр класса - PullRequest
0 голосов
/ 12 декабря 2018

с использованием c # .net 4.7.1 У меня есть класс с именем Deck, вот код:

public class Deck
{
    public Card[] DeckOfCards { get; private set; } = new Card[56];        

    public Deck()
    {
        DeckOfCards = NewDeck();
    }

    private Card[] NewDeck()
    {
        Card[] newDeck = new Card[56];
        ....
        return newDeck;
    }
}

Я хотел бы объявить метод класса в Deck с именем Shuffle, который ясможет вызвать экземпляр Deck, который я создаю.Вот как я представляю свой метод Main в моей программе:

class program
{
    static void Main(string[] args)
    {
        Deck WorkingDeck = new Deck();
        WorkingDeck.DeckOfCards.Shuffle();
        ....
    }
}

Вот все, что у меня есть для метода класса Shuffle:

    public Card[] Shuffle(this Card[] DeckToShuffle)
    {
        Random rnd = new Random();
        Card[] ShuffledDeck = DeckToShuffle.OrderBy(x => rnd.Next()).ToArray();
        return ShuffledDeck;
    }

Но для этого нужно, чтобы япередать Card[] в моем вызове метода.Я хотел бы, чтобы метод использовал WorkingDeck.DeckOfCards в качестве Deck, который перетасовывается.Может ли кто-нибудь указать мне правильное направление, чтобы я смог это сделать?Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

В этом конкретном сценарии хорошим решением будет метод Extension.

public static class Extensions
{
    public static void Shuffle(this IEnumerable<Card> source)
    {
        // Body of Shuffle
    }
}

Это поможет вам вызвать shuffle так, как вам нужно

Deck WorkingDeck = new Deck();
WorkingDeck.DeckOfCards.Shuffle();
0 голосов
/ 12 декабря 2018

Свойство DeckOfCards является членом класса.Метод класса может автоматически обращаться к его членам (неявно или через ключевое слово this).

public class Deck
{
    public Card[] DeckOfCards { get; private set; };        

    public Deck()
    {
        this.DeckOfCards = NewDeck();
    }

    static Card[] NewDeck()
    {
        Card[] newDeck = new Card[56];
        ....
        return newDeck;
    }

    public void Shuffle()
    {
        Random rnd = new Random();
        Card[] shuffledDeck = this.DeckOfCards.OrderBy(x => rnd.Next()).ToArray();
        this.DeckOfCards = shuffledDeck;
    }
}

Вы бы вызвали его следующим образом:

static void Main(string[] args)
{
    Deck workingDeck = new Deck();
    workingDeck.Shuffle();
    ....
}

Этот дизайн имеетDeck как изменяемый объект: Shuffle изменяет порядок существующей колоды, а не создает другую колоду.

В качестве отступления существуют более удобные методы перемешивания.Термин Google здесь называется «алгоритм Фишера-Йейтса».

0 голосов
/ 12 декабря 2018

Во-первых, вы можете упростить свой класс Deck следующим образом:

public class Deck {

    public Card[] DeckOfCards { get; private set; } = NewDeck();

    private static Card[] NewDeck() {
        Card[] newDeck = new Card[56];
        ....
        return newDeck;
    }
}

Если вы хотите Shuffle изменить порядок карточек в вашем Deck, вы можете написать метод расширения, вот так:

static class DeckExtensions {

    public static void Shuffle(this deck)
    {
        Random rnd = new Random();
        deck.DeckOfCards = deck.DeckOfCards.OrderBy(x => rnd.Next()).ToArray();
    }

}
...