2012-07-24 90 views
2

說我有兩個班方法 - 減少重複

class Driver{ 
    //attributes of driver ,ex: driving licence number 
    // methods related to driving ,ex: drive(Car) , stop(Car) 
    changeTyre(Car,Tyre); // sometimes the driver can change the tyres right? 
} 
class Mechanic{ 
    // Hard mechanical stuff , ex: repairEngine(Car) 
    changeTyre(Car,Tyre); // Simple.hence sometimes the driver also does 
} 

現在兩個changeTyre()方法的實現將是相同的。

現在我有兩個問題,

  1. 有一個代碼重複(重複)
  2. 它似乎沒有意義的具有包含changeTyre(Car,Tyre)方法的超級類

如何這些情況處理?

+1

'changeTyre(Car,Tyre)'做的是類方法嗎?如果實現是相同的,我希望它不一定是一個類方法(不使用類屬性/方法),或者兩個類的重疊程度都超過了你的建議(例如,這個人的名字可能是記錄更改輪胎:兩個類都有一個名稱屬性),在這種情況下會有一個有意義的基類(例如Person或CarLover或其他)。 – catchmeifyoutry 2012-07-24 12:27:43

+0

changeTyre(Car,Tyre)是一個類方法,因爲它既是Driver和Mechanic的行爲(我想我是正確的)。我仍然沒有「確信」擁有包含changeTyre(Car,Tyre )方法:( – Dinushan 2012-07-24 12:31:54

+0

@ D-Shan:這也是汽車和輪胎的行爲:) – user396672 2012-07-24 12:50:51

回答

3

爲了擴大繼承使用構圖(Willie's answer),我認爲你在使用ChangeTyre(如car.ChangeTyre(Tyre))的評論中處於正確的軌道。

每個技工或驅動程序將關聯到一輛車,這樣他們就可以擁有一輛汽車性能 -

class Driver{ 

    Car driverCar; 

    //constructor 
    Driver(Car car) 
    { 
     driverCar = car; 
    } 

    //attributes of driver ,ex: driving licence number 
    // methods related to driving ,ex: drive(Car) , stop(Car) 
    changeTyre(Tyre) 
    { 
     driverCar.changeTyre(Tyre); 
    } 
} 

他們changeTyre司機和機械師的方法可能是相同的,但實際的邏輯換胎將住在一個地方。我不認爲繼承是有效的,因爲機制不是驅動因素,繼承支持「是」關係。將changeTyre強制爲超類(稱爲Person)可能沒有意義,因爲不是每個從Person繼承的類都需要有changeTyre方法。有關繼承構成的更多信息,請參見this question

+0

ok.anyhow在作品中,我們無法幫助它有一點點複製權嗎? – Dinushan 2012-07-25 05:20:44

+0

@ D-Shan - 沒錯。您可以說駕駛員將更換輪胎的工作委託給汽車。這輛車是真正知道如何換胎的。也許一個AirportMechanic有一個飛機屬性,他的'changeTyre'將這項工作委託給飛機 - 'airplane.changeTypre(Tire)' – rosscj2533 2012-07-25 15:15:47

1
class Driver 
{ 
    //attributes of driver ,ex: driving licence number 
    // methods related to driving ,ex: drive(Car) , stop(Car) 
    public TyreFunction TyreFunctions { get; set; } 
} 

class Mechanic { 
    // Hard mechanical stuff , ex: repairEngine(Car) 
    // Simple.hence sometimes the driver also does 
    public TyreFunction TyreFunction { get; set; } 
} 

class TyreFunction 
{ 
    change(Car,Tyre) 
} 

這樣做!

然後你在一個類中沒有重複的代碼和控制。您也可以創建所有功能列表,將特定的功能添加到類中。

+0

+1,某種類型的組合(而不是繼承)似乎是這裏的答案。 – rosscj2533 2012-07-24 13:17:37

0

我建議Mechanic應該從Driver繼承,因爲我假設在你的上下文中,任何一個驅動程序都可以做一個機械師能夠做的事情(即駕駛汽車進行測試)。

changeTyre方法應該是虛擬的,以便它可以被Mechanic覆蓋,因爲實現可能會有所不同(不同的工具等)。

我還建議,一些元素應該分成接口(駕駛方法,汽車維修方法等)。

+0

好吧,這似乎工作。我還沒有想到,機械師是一個驅動程序 – Dinushan 2012-07-24 13:08:06

+1

@ D-Shan有可能,如果你把Driver分成接口,你會發現Driver是由幾個元素構成的。每個駕駛員真的能改變一個人嗎?但是,情況是機械師是一名司機。 – 2012-07-24 13:16:08