C#缺乏静态继承 - 我该怎么办?

时间:2010-04-09 00:16:50

标签: c# inheritance oop

好吧,你可能知道,在C#中不可能进行静态继承。我明白,但是我仍然坚持我的程序开发。

我会尽量让它变得简单。让我们说我们的代码需要管理在某些机场展示飞机的物体。要求如下:

  • 所有飞机共享的成员和方法

  • 飞机种类繁多,每种类型都有自己的额外方法和成员。每种飞机类型可以有很多种情况。

  • 每种飞机类型必须具有此类型的友好名称,以及有关此类型的更多详细信息。例如,名为F16的类将具有静态成员FriendlyName,其值为“Lockheed Martin F-16 Fighting Falcon”。

  • 其他程序员应该能够添加更多的飞机,但必须强制执行以创建有关飞机类型的相同静态细节。

  • 在某些GUI中,应该有一种方法让用户看到可用类型列表(带有诸如FriendlyName之类的详细信息),并添加或删除飞机实例,保存,比方说,某些XML文件。

所以,基本上,如果我可以强制执行继承类来实现静态成员和方法,我会强制使用类型的静态成员,例如FriendlyName。可悲的是,我做不到。

那么,这种情况下最好的设计是什么?

7 个答案:

答案 0 :(得分:8)

一个答案是用属性(元数据)装饰每个类:

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

这是使用System.ComponentModel中的DescriptionAttribute

您可以获得这样的元数据:

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

这将为您提供对F16类的引用的描述文本。

答案 1 :(得分:4)

为什么需要这些属性是静态的?

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

public class F16 : Aircraft
{
   public F16()
   {
     AircraftName="F16 Falcon";
   }
}

答案 2 :(得分:3)

不要使用静态方法。而是使用实例方法。

此外,摘要可能会公开一个抽象方法,该方法将返回飞机的特定名称。

public abstract class Aircraft
{
    public abstract string Name { get; }
    public abstract string FriendlyName { get; }
}

答案 3 :(得分:2)

在这种情况下,您可以从工厂模式中受益。不是进口特定类型的飞机,而是提供标准的IAircraftFactory界面,定义每个飞机工厂需要为您做什么。这是您可以返回描述,UI信息等的地方。然后飞机工厂负责创建特定的飞机。因为您的客户必须创建一个自定义工厂以暴露他们的飞机,他们被迫实施界面并提醒(通过其成员)他们有合同要履行。

类似的东西:

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();
    }

    //...
}

答案 4 :(得分:1)

对友好名称使用枚举,并为友好名称创建该类型的实例成员。在施工期间需要初始化此成员。

答案 5 :(得分:0)

答案 6 :(得分:0)