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

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

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

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

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

textual
Листинг программы
  1.     class Program
  2.     {
  3.  
  4.         private static void Main(string[] args)
  5.         {
  6.             Ship ship = new AirCarrier(ShipType.Straight);
  7.             Console.WriteLine(String.Join(", ", ship.GetValidTypes()));
  8.             Console.WriteLine(ship.Type);
  9.  
  10.             ship = new BattleShip(ShipType.Angle);
  11.             Console.WriteLine(String.Join(", ", ship.GetValidTypes()));
  12.             Console.WriteLine(ship.Type);
  13.  
  14.         }
  15.     }
  16.  
  17.    
  18.  
  19.     enum ShipType { Straight, Plus, Angle }
  20.  
  21.  
  22.     abstract class Ship
  23.     {
  24.         private static Dictionary<Type, List<ShipType>> Types = new Dictionary<Type, List<ShipType>>();
  25.         private ShipType _type;
  26.  
  27.         static Ship()
  28.         {
  29.             Types.Add(typeof(AirCarrier), new List<ShipType> { ShipType.Angle, ShipType.Plus, ShipType.Straight});
  30.             Types.Add(typeof(BattleShip), new List<ShipType> { ShipType.Angle, ShipType.Straight });
  31.         }
  32.  
  33.  
  34.         public ShipType Type
  35.         {
  36.             get { return _type; }
  37.             protected set
  38.             {
  39.                 if (GetValidTypes().Contains(value))
  40.                 {
  41.                     _type = value;
  42.                 }
  43.                 else
  44.                 {
  45.                     throw new ArgumentException("Invalid ship type");
  46.                 }
  47.             }
  48.         }
  49.  
  50.         public List<ShipType> GetValidTypes()
  51.         {
  52.             return Types[GetType()];
  53.         }
  54.  
  55.         public override string ToString()
  56.         {
  57.             return String.Format("Type: {0}", Type);
  58.         }
  59.     }
  60.  
  61.  
  62.     class AirCarrier : Ship
  63.     {
  64.         public AirCarrier(ShipType type)
  65.         {
  66.             Type = type;
  67.         }
  68.  
  69.  
  70.     }
  71.  
  72.     class BattleShip : Ship
  73.     {
  74.         public BattleShip(ShipType type)
  75.         {
  76.             Type = type;
  77.         }
  78.     }

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


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

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

13   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы