2009-01-07 52 views
5

我有一个C#基类,我是关联信息与每类型(而不是每个实例)的基础上。基本上,我希望所有的子类都提供一个表示类型的Icon和FriendlyName。我想不是必须创建一个类型实例来获取这些信息,我想要求所有的子类都提供这些信息。理想情况下,它将在基础派生的界面中。提供继承的静态属性(概念上)

我试着使用一个类属性,但它需要一个常量值,所以虽然我可以设置FriendlyName,但我无法设置图标,也无法看到一种方法来使属性成为必需,所以儿童班可以逃脱不了(直到跑步时间)。

我在孩子可以隐藏的基础上添加了一个静态属性,但这有点丑陋,基底中的值真的很荒谬。它不知道孩子的名字是什么。我可以在该属性中进行基本投掷,但同样,在运行时间之前不会被捕获。

任何人对我如何实现这样的东西有任何想法?有没有我失踪的模式?任何开箱即用的想法都会受到鼓励。

编辑:真的,我需要能够沿继承树请求类属性,并且能够使用嵌入式资源来设置这些属性。所有将要返回的信息都是静态的,并且在编译时已知。我无法想出一个很好的揭示它的方法。

编辑2:这里是什么,我需要更具体的例子:

假设我有一个基类:

abstract class Vehicle { ... } 

然后我有两个孩子:

class Car : Vehicle { ... } 

class Truck : Vehicle { ... } 

我希望能够获得代表“Car”或“Truck”的图标,而无需创建一个(la Car.Icon)的实例,因为所有车辆一个给定的类型都将具有相同的图标。

我也希望确保所有车辆派生的类型公开相同的方式来获得该图标,以防有人在未来走来,并增加了一类新的

class Airplane : Vehicle { ... } 

编辑3:为什么我需要这个?那么我们有一个可以插入插件的应用程序。插件由类型定义,当类型被加载时,我们向用户显示图标和名称。当他们点击图标时,它会创建该类型的实例(并为它们提供一个命名实例的对话框等)。我不需要或不想创建一个类型的实例来获取图标。

回答

1

如果你想完全决定子实现这一点,那么我看到这样做的唯一方法是使基类抽象,并公开实例属性返回图标和友好名称。

这些将是抽象的,而不是虚拟的,所以你强制派生类的实现。我知道这不是干净的,因为它是更好地存储在类型级别上的信息,但是这是我在编译时强制执行此要求的唯一方法。

+0

是的,这是我走的路线,但我只是觉得很脏。不得不创建一个实例来获取信息会增加如何使用信息的复杂性。 – ctacke 2009-01-07 21:54:46

1

我认为你可能错过的一点是,你不能有一个很好的理由重写静态属性 - 也就是说当你编写代码来调用它时,你没有instace,所以编译器将在那时静态链接它 - 如果你需要多态性,你需要与运行时的实例一起工作,以确定调用哪个版本的方法。

编辑:(针对您的EDIT2)

,你会想什么情况下从调用这个?

如果你想显示你的图标对一个实例,你有一个实例,所以为什么不把它作为一个实例的属性(因为毕竟,有人可能会覆盖你的Car创建一个SportsCar并且需要一个不同的图标) - 实际上,您要求提供对象的属性,尽管它与概念模型相匹配(所以它不是轮子的数量,最大速度等;但是可以将其可视化对最终用户)

EDIT2:(针对您的EDIT3)

我做的是沿着林东西的方法es使用属性来标识哪个嵌入资源用作相应类型的图标(因此您不需要实例),并使用反射来读取值。您可以定义您自己的自定义属性,或者查看ToolboxItemAttribute哪些可能被使用。

+0

不,我没有错过 - 这就是为什么标题包含“概念性”的原因。我知道我不能继承静态,但我需要这种概念行为。 – ctacke 2009-01-07 22:04:53

0

也许你可以做的是定义一个属性,用于在你的插件系统中注册该对象。

通过这种方式,您将强制类的开发人员分配属性,以便在您的插件系统中工作。

也许你可以使用像ToolboxBitmapAttribute这样的方法,在这里你可以将找到的图像设置为你的dll资源。