Использование публичного статического класса внутри абстрактного - 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; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д