好吧,你可能知道,在C#中不可能进行静态继承。我明白,但是我仍然坚持我的程序开发。
我会尽量让它变得简单。让我们说我们的代码需要管理在某些机场展示飞机的物体。要求如下:
所有飞机共享的成员和方法
飞机种类繁多,每种类型都有自己的额外方法和成员。每种飞机类型可以有很多种情况。
每种飞机类型必须具有此类型的友好名称,以及有关此类型的更多详细信息。例如,名为F16的类将具有静态成员FriendlyName,其值为“Lockheed Martin F-16 Fighting Falcon”。
其他程序员应该能够添加更多的飞机,但必须强制执行以创建有关飞机类型的相同静态细节。
在某些GUI中,应该有一种方法让用户看到可用类型列表(带有诸如FriendlyName之类的详细信息),并添加或删除飞机实例,保存,比方说,某些XML文件。
所以,基本上,如果我可以强制执行继承类来实现静态成员和方法,我会强制使用类型的静态成员,例如FriendlyName。可悲的是,我做不到。
那么,这种情况下最好的设计是什么?
答案 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)
解决此问题的有趣方法是识别设计中的飞机类型也是一个重要的概念,并将它们创建为单独的类,其实例充当飞机的类型。这被称为type object pattern (pdf),它允许非常灵活的设计。