存储不同子类的列表/数组的最佳方法

0 c#

我正在尝试编写一个程序来模拟纸牌游戏.我有一个名为MagicCard的课程,以及各种扩展卡片的课程,比如card1,card2 ......我想找到一种方法来存储不同卡片的列表/数组(甲板).每个card1,card2 ......都有一个"特殊"效果,它们在播放时会触发,因此需要一个独特的功能,这就是为什么我需要所有不同的子类.很多卡都有类似的属性.如何以合理和方便的方式存放卡座?(我希望可以轻松操作卡座,这样我就可以添加卡片,或者在需要时从卡片中取出卡片).

目前这就是我所拥有的:

//My Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace mtgDeckSimulator
{

    //General properties of a magic card, extended by individual classes
    class cardProperties
    {
        private String cardName;
        /*Mana Array Aranged in the following Order:
         * [Colorless,White,Blue,Black,Red,Green] */
        private int[] manaCost;
        /* Card Type int definitions:
         * 0-Artifact
         * 1-Creature
         * 2-Enchantment
         * 3-Instant
         * 4-Land
         * 5-Planeswalker
         * 6-Sorcery
         * 7-Tribal */
        private int cardType;
        public int attack;
        public int defense;
        private bool permBool;
        private bool isLegen; //Or is restricted to one copy
        public cardProperties(String cardName,int[] manaCostIn,int cardTypeIn,int attack,int defense,bool permBoolIn,bool isLegenIn)
        {
            this.cardName = cardName;
            manaCost = manaCostIn;
            cardType = cardTypeIn;
            permBool = permBoolIn;
            isLegen = isLegenIn;
        }
        //Get Variables
        public String getCardName()
        {
            return cardName;
        }
        public int[] getManaCost()
        {
            return manaCost;
        }
        public int getCardType()
        {
            return cardType;
        }
        public bool getPermBool()
        {
            return permBool;
        }
        public bool getIsLegen()
        {
            return isLegen;
        }
        //Other Methods
    }

    //Interface for magic cards
    interface MagicCard
    {
        int SpecialEffect();
    }
    #region Magic Card List
    class WallOfOmens : cardProperties, MagicCard
    {
        public WallOfOmens()
            : base("Wall of Omens", new int[6] { 1, 1, 0, 0, 0, 0 }, 1, 0, 4, true, false)
        {
            ;
        }
        public int SpecialEfect()
        {
            return 1;
            //throw new NotImplementedException();
        }
    }
    class Card2 : cardProperties, MagicCard
    {
        public int SpecialEfect()
        {
            return 2;
            //throw new NotImplementedException();
        }
    }
    #endregion
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现这个?此外代码不起作用,因为它告诉我WallOfOmens和Card2没有实现SpecialEffect(),为什么会发生这种情况?

Alb*_*nbo 5

我会考虑另一种方法,使用组合而不是继承.组合比继承更灵活,它允许您比继承更自由地组合不同方面.

而不是创造

abstract class BaseCard{abstract int SpecialEffect();}
class Card1 : BaseCard{override int SpecialEffect(){return 1;}}
class Card2 : BaseCard{override int SpecialEffect(){return 2;}}
...
Run Code Online (Sandbox Code Playgroud)

您创建不同的SpecialEffect类

abstract class SpecialEffectBase{abstract int SpecialEffect();}
class SpecialEffect1 : SpecialEffectBase{override int SpecialEffect(){return 1;}}
class SpecialEffect2 : SpecialEffectBase{override int SpecialEffect(){return 2;}}
...
Run Code Online (Sandbox Code Playgroud)

并在工厂组装不同的卡

Card card1 = new Card(new SpecialEffect1());
Card card2 = new Card(new SpecialEffect2());
Run Code Online (Sandbox Code Playgroud)

这可能听起来只是间接的另一个步骤,但是如果你在不同的卡片中重复使用多个效果,并且在卡片之间有其他属性不同,比如规则或其他东西,你可以像这样组装它们

Card card1 = new Card(new SpecialEffect1(), new Rule1());
Card card2 = new Card(new SpecialEffect1(), new Rule2());
Card card3 = new Card(new SpecialEffect2(), new Rule1());
Card card4 = new Card(new SpecialEffect2(), new Rule2());
...
Run Code Online (Sandbox Code Playgroud)

另一个好处是它强制您将SpecialEffect规则封装在SpecialEffect类中,规则类中的规则规则等,而不是将它们全部包含在Card类中.