2010-06-23 62 views
1

我真的不親,找到我的問題挺難形容,所以請問,如果有不清楚的地方:把我的繼承類在一個抽象的「工廠」 C#

我有一個叫BaseDevice抽象類。 其他設備,如Beacon和Transponder,繼承自BaseDevice。 例如Beacon,它具有BaseClass方法和自己的屬性方法。 比方說,這些設備之間的區別是,一個有2個LED,一個有LCD

目前它不可能做一個設備轉發器以及燈塔(或我必須複製粘貼到一個新的類,這是不想要的)。

因此,例如, 我希望能夠讓一個設備對它說:「你有一個LED」,「你有2個LCD」或其他。並且隨附的所有方法和屬性都應該可用。我還需要能夠看到我的設備列表中有哪些設備「他是否有一個(或多個)LED」

結論:我想讓我的「是A」變成「」有A「(作爲四人幫推薦)。

我對工廠設計模式這看起來複雜讀一次。這將是在這種情況下,一個好的解決方案?

也許我用了一些撒姆這裏超過我知識,這個項目是我第一次使用抽象類等。我真的沒有太多的面向對象的程序員。設計模式很難讓我閱讀,所以回答t帽子很容易閱讀,比歡迎。

回答

1

對我來說,這聽起來像你需要一個Decorator

在面向對象編程中,裝飾器模式是一種設計模式,允許將新/附加行爲動態添加到現有對象。

裝飾者模式是子類別的替代方案。子類在編譯時添加行爲,並且該更改會影響原始類的所有實例;裝飾可以在運行時爲單個對象提供新的行爲。

對你而言,棘手的部分是爲所有的子類定義一個通用接口。如果這是不可能的,無論如何你都不能多態地使用你的對象。

+0

看起來不錯!謝謝 修飾者是否只能添加方法或屬性? 而且最重要的是:我可以看到設備裝飾了什麼嗎? – SirLenz0rlot 2010-06-23 09:16:11

+0

如果你想看到新的方法和屬性,也許裝飾者不是你的正確選擇。它意味着能夠以多態方式處理組件。按照@Henk的建議,將各種組件集成到設備中,也許你會更好。例如。在設備中有一組LCD和另一組LED,然後將2個LED推入設備A,1個LCD進入設備B等。 – 2010-06-23 09:27:11

+0

謝謝,亨克刪除了他的答案,但我明白了他的意思。我會看看是否有這樣的事情 我希望有一個更漂亮的解決方案,因爲這些設備可以有更多的不僅僅是LED和LCD。 – SirLenz0rlot 2010-06-23 09:38:17

1

我認爲你需要的是你的設備組件的一些額外的類。例如,如果有一些與LED相關的行爲,並且您發現自己複製/粘貼此代碼,則這是一個強烈的跡象表明您需要LED類。 這樣你可以有List<LED>字段和Add(LED newLed)方法,你可以在具體的組件上使用。基本上這是「有A」的關係。你可以有另一個LCD課程,現在你可以在你的具體課程中混合和匹配這些東西。

+0

感謝您的回答,這歸結爲Péter總結(在評論中)的相同答案。 – SirLenz0rlot 2010-06-24 08:53:53