Использование публичного статического класса внутри абстрактного - 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;
}
}