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