2011-03-04 87 views
5

我不是OOPS和/或設計模式方面的專家。是一款帶汽車保險槓貼紙子類的汽車嗎?

我遇到過這種情況:一輛汽車是否有汽車的保險槓貼紙子類?

如果不是那麼我該如何添加動態屬性到對象的實例?例如一輛汽車,一輛帶保險槓貼紙的汽車等。

並非所有的汽車都有保險槓貼紙。你可以添加一個保險槓貼紙,甚至不止一個保險槓貼紙。我無法實現與汽車貼紙,afaik,執行我會迫使我添加貼紙。汽車上的保險槓貼紙是汽車(物體?)創建後誕生的一種新物業。

+0

取決於您對保險槓貼紙的看法。不得不爲汽車的每一分鐘變化(擾流板,雪地輪胎,天線)劃分子類是一件痛苦的事情。這個問題不是真的可以回答。 – 2011-03-04 08:28:40

+1

不 - 一輛貼有標籤的汽車仍然是一輛汽車 - 也許它的一個屬性發生了變化,但它不是一個子類,我認爲。 – 2011-03-04 08:29:12

+3

請回答以下問題:每輛車都可以有保險槓貼紙嗎?帶有保險槓標籤的汽車的行爲與沒有汽車的行爲有什麼不同?如果一輛汽車有幾輛車,預計行爲會發生什麼變化? – Philipp 2011-03-04 08:40:22

回答

7

對於這種情況,您可以使用Decorator Design Pattern。它可以讓你「爲對象的實例添加動態屬性」,這就是你所提到的,你可以通過「裝飾」你的car類在所有可能的組合中添加任何貼紙或任何其他屬性。

+0

謝謝:)我將花一些時間與咖啡的例子 – Kumar 2011-03-04 13:59:01

1

如果在你的情況下保險槓貼紙是常見的事情,你可以設置一個布爾屬性(真/假)或字符串,如果這是你的情況。

如果保險槓貼紙很複雜是它自己的一類,也許汽車應該實現貼紙? (這裏指的是Java中的實現)

至於Dynamic,與汽車相關的屬性數據庫表是可以接受的嗎?

+0

我認爲關鍵是,如上所述,是足夠需要一類自己的保險槓貼紙複雜?您是否記錄存在保險槓貼紙或其細節?否則只需要一個布爾值爲0或更多的貼紙,整數爲一個計數等。 – Karl 2011-03-04 08:39:31

+0

這不會導致一個很好的設計,保險槓貼紙是完全可選的,但可以有一輛車甚至自行車,如果它足夠小 – Kumar 2011-03-04 08:42:54

0

其實,當你購買汽車時,你會選擇汽車本身以及一系列選項(音樂,室內等)。就像在現實生活中一樣,你可以在你的汽車中引入「選項」。在它看起來像(C++)的簡單情況:

class Car { 

    enum CarOptions { 
     Bumper, 
     ... 
    }; 

    ... 

    int options() const { return m_options; } 
    void setOptions(int options) { m_options = options } 

    ... 
}; 

Car c; 
c.setOptions(c.options() | Car::Bumper); 

當然,這種解決方案有它自己的優點和缺點,任何其他。

+0

可以你列舉了利弊? – Kumar 2011-03-04 08:41:03

+0

親:簡單; con:只有一個布爾指示表明已經設置了一個選項,不能存儲其他信息(例如打印在貼紙上的內容) – Tony 2011-03-04 08:44:49

+0

優點:使用起來非常簡單,當你有很多選項時(非1或2但10或20)。缺點:如果Bumper本身很複雜,那麼您可能應該使用其他解決方案。這取決於。 – maverik 2011-03-04 08:50:13

1

請勿過分複雜。

class Car 
{ 
public: 
    bool hasBumperSticker() const { return m_hasBumperSticker; } 

private: 
    bool m_hasBumperSticker; 
}; 

或者,如果保險槓貼紙都有自己的屬性:

class Car 
{ 
public: 
    bool hasBumperSticker() const { return m_bumperSticker != 0; } 

private: 
    BumperSticker* m_hasBumperSticker; 
}; 
+0

保險槓貼紙是一個例子,我可以添加許多其他屬性,所以根據您的需要,我需要爲所有這些屬性設置hasProprtyXYZ()方法,這裏是有些東西只是卡住了我 'code' class car { \t private propertyarray; \t公共hasProperty(PROPERTYNAME){返回(isset(this.proprtyarray [PROPERTYNAME])真:假);} \t公共的setProperty(PROPERTYNAME,值){this.proprtyarray [PROPERTYNAME] =值;}} ' 代碼' – Kumar 2011-03-04 08:48:14

2

到汽車,你所談論的變化是動態的屬性。就我個人而言,我將在Car類中實施一系列配件,其中一個將是BumperSticker。

然後,您可以添加和刪除附件,而無需爲所有可用選項劃分子類Car。

如果沿着繼承路線走下去考慮一輛汽車有BumperSticker和Spoilers的情況,那麼您將擁有多重遺傳,這在C++中是令人不悅的,並且在其他語言中不可用。

+0

在這種情況下,它也被忽視*,因爲帶保險槓貼紙的汽車和帶擾流板的汽車並不是兩種不同類型的汽車。他們是單一類型汽車的屬性。 – 2011-03-04 09:06:13

+0

確切地說,保險槓貼紙只是您的汽車可能擁有且我可能缺少的汽車的「另一個」屬性或屬性 – Kumar 2011-03-04 09:21:39