2009-01-07 54 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資源。