Отсутствие C# статического наследования - что я должен сделать?

Хорошо, поэтому как Вы, вероятно, знаете, статическое наследование невозможно в C#. Я понимаю, что, однако застреваю с разработкой моей программы.

Я попытаюсь сделать его максимально простым. Позволяет говорят, что наш код должен управлять объектами, которые представляют самолеты в некотором аэропорту. Требования следующие:

  • Существуют участники и методы, которые совместно используются для всех самолетов

  • Существует много типов самолетов, каждый тип может иметь свои собственные дополнительные методы и участников. Может быть много экземпляров для каждого типа самолета.

  • Каждый тип самолета должен иметь дружественное название этого типа и больше деталей об этом типе. Например, класс по имени F16 будет иметь статического участника FriendlyName со значением "Lockheed Martin F-16, Борясь с Соколом".

  • Другие программисты должны смочь добавить больше самолетов, хотя они должны быть осуществлены для создания тех же статических деталей о типах самолетов.

  • В некотором GUI должен быть способ позволить пользователю видеть список доступных типов (с деталями, такими как FriendlyName) и добавить или удалить экземпляры самолетов, сохраненных, позволяет, говорят, к некоторому XML-файлу.

Так, в основном, если бы я мог бы осуществить наследованные классы для реализации статических участников и методов, я осуществил бы типы самолетов, чтобы иметь статических участников, таких как FriendlyName. Печально я не могу сделать этого.

Так, каков был бы лучший дизайн для этого сценария?

7
задан yellowblood 9 April 2010 в 00:16
поделиться

5 ответов

Один из ответов - украсить каждый класс атрибутами (метаданными):

[Description("Lockheed Martin F-16 Fighting Falcon")]
public class F16 : Aircraft
{
    // ...
}

Здесь используется DescriptionAttribute уже в System.ComponentModel .

Вы можете получить метаданные следующим образом:

Type t = typeof(F16);
DescriptionAttribute attr = (DescriptionAttribute)Attribute.GetCustomAttribute(t,
    typeof(DescriptionAttribute));
string description = (attr != null) ? attr.Description : t.Name;

Это даст вам текст описания из ссылки на класс F16 .

8
ответ дан 6 December 2019 в 10:48
поделиться

Почему вам нужно, чтобы эти свойства были статическими?

public class Aircraft
{
protected string AircraftName { get; protected set; }
}

public class F16 : Aircraft
{
   public F16()
   {
     AircraftName="F16 Falcon";
   }
}
4
ответ дан 6 December 2019 в 10:48
поделиться

Не используйте статические методы. вместо этого используйте методы экземпляра.

Также верхняя аннотация может выставлять абстрактный метод, который вернет конкретному названию самолета.

public abstract class Aircraft
{
    public abstract string Name { get; }
    public abstract string FriendlyName { get; }
}
3
ответ дан 6 December 2019 в 10:48
поделиться

Используйте перечисление для понятных имен и создайте член экземпляра этого типа для понятного имени. Требовать инициализацию этого члена во время строительства.

1
ответ дан 6 December 2019 в 10:48
поделиться

Это тот случай, когда вам может быть полезен паттерн Factory. Вместо того, чтобы импортировать конкретные типы самолетов, предоставьте стандартный интерфейс IAircraftFactory, который определяет, что должна делать каждая фабрика самолетов для вас. Именно здесь вы можете возвращать описания, информацию о пользовательском интерфейсе и т.д. Фабрика самолетов затем отвечает за создание конкретного самолета. Поскольку ваши клиенты должны создать пользовательскую фабрику, чтобы представить свои самолеты, они вынуждены реализовать интерфейс и напоминать (через его члены), что у них есть контракт, который они должны выполнить.

Что-то вроде:

public interface IAircraft
{
    //Aircraft instance details...
}

public interface IAircraftFactory
{
    //Can include parameters if needed...
    IAircraft BuildAircraft();

    //And other useful meta-data...
    string GetDescription();
}

//In some other Client-provided DLL...
public class MyAircraftFactory : IAircraftFactory
{
    IAircraft BuildAircraft()
    {
        return new MyAircraft();
    }

    //...
}
2
ответ дан 6 December 2019 в 10:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: