Использование публичного статического класса внутри абстрактного - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет! Чувствую, истина где-то близко. Морской бой! Есть корабли. "Air Carrier" это 5-и палубный корабль. У меня есть абстрактный класс "Ship", от которого я наследую "Air Carrier", "Battleship", "Cruiser", "Destroyer" и "Submarine". Дело вот в чём: пытаюсь реализовать такую версию игры, в которой корабли могут быть загогулинами, а не прямыми палками. И мне бы хотелось реализовать что-то вроде такого кода:
Ship ship = new AirCarrier();
ship.ShipType = ship.ShipTypes.Straight;
Я бы очень хотел, чтобы "ShipTypes" было бы абстрактным, то есть, чтобы он обязательно переписывался в потомочных классах класса "Ship", потому что вариаций загогулин в пятипалубном корабле намного больше чем, скажем, в трехпалубном. Но, если не сделать "ShipTypes" абстрактным, а описать тупо в каждом потомочном классе, как enum, то тогда возникает еще куча проблем, одна из которых является фактом того, что мы тупо можем её оставить нереализованной, а это обязательный фактор. Помогите пожалуйста. Может быть я, как обычно, всё усложнил в 40 раз и не вижу элементарных вещей. Заранее спасибо. P.S. Знаю, что статические классы не могут быть абстрактными, так же как и enum.

Решение задачи: «Использование публичного статического класса внутри абстрактного»

textual
Листинг программы
    class Program
    {
 
        private static void Main(string[] args)
        {
            Ship ship = new AirCarrier(ShipType.Straight);
            Console.WriteLine(String.Join(", ", ship.GetValidTypes()));
            Console.WriteLine(ship.Type);
 
            ship = new BattleShip(ShipType.Angle);
            Console.WriteLine(String.Join(", ", ship.GetValidTypes()));
            Console.WriteLine(ship.Type);
 
        }
    }
 
    
 
    enum ShipType { Straight, Plus, Angle }
 
 
    abstract class Ship
    {
        private static Dictionary<Type, List<ShipType>> Types = new Dictionary<Type, List<ShipType>>();
        private ShipType _type;
 
        static Ship()
        {
            Types.Add(typeof(AirCarrier), new List<ShipType> { ShipType.Angle, ShipType.Plus, ShipType.Straight});
            Types.Add(typeof(BattleShip), new List<ShipType> { ShipType.Angle, ShipType.Straight });
        }
 
 
        public ShipType Type
        {
            get { return _type; }
            protected set
            {
                if (GetValidTypes().Contains(value))
                {
                    _type = value;
                }
                else
                {
                    throw new ArgumentException("Invalid ship type");
                }
            }
        }
 
        public List<ShipType> GetValidTypes()
        {
            return Types[GetType()];
        }
 
        public override string ToString()
        {
            return String.Format("Type: {0}", Type);
        }
    }
 
 
    class AirCarrier : Ship
    {
        public AirCarrier(ShipType type)
        {
            Type = type;
        }
 
 
    }
 
    class BattleShip : Ship
    {
        public BattleShip(ShipType type)
        {
            Type = type;
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5
Похожие ответы