2013-06-01 52 views
0

認爲我在OOP中沒問題,但似乎遇到了絆腳石。在OOP中分別調用父對象和子對象

在這個例子中,我有一輛汽車,一輛寶馬和一輛奧迪。汽車有一套行爲,寶馬和奧迪分別繼承了汽車。

 
---Car--- 
| ----- | 
---------- 
BMW --- Audi 

當用戶創建一個對象時,他們通過子類來做到這一點,例如新寶馬。這很好,因爲寶馬具有不同的屬性和檢索和存儲這些屬性的方法。然而,在下一個屏幕上,我想顯示汽車(可能是寶馬或奧迪),所以基本上我想在此做Car-> getName(),例如,考慮到寶馬的名字與奧迪的名字存儲方式不同。我如何實現這一目標?我可以使用case語句,但是我真的不想這樣做,因爲我認爲這不是好的做法。有任何想法嗎?

+0

'carInstance.getName()'? –

+0

@Keyser不完全是原因,但奧迪存儲在音頻表中,寶馬存儲在寶馬錶中。聽起來像一個可怕的結構,但沒有進入大量的細節我已經這樣做了! – Dogday

回答

1

您需要製作getName()抽象方法。使Car爲抽象類,以便它不能被實例化。然後在AudiBMW子類中,覆蓋getName()方法以正確返回名稱。

這都假設Java,但我相信PHP有類似的OOP概念。

編輯:看來你可能需要一個工廠。首先,讓汽車抽象化。然後,在某個地方使用此方法(如Car中的靜態方法)。

public Car carFactory(DB database) { 
    if (DB.shouldMakeAudi()) { 
     return new Audi(); 
    } else if (DB.shouldMakeBMW()) { 
     return new BMW(); 
    } else { 
     return null; 
    } 
} 
+0

這是我設想的方式,但是在顯示汽車的頁面上,我不知道這是寶馬還是奧迪,所以我需要給汽車類打電話,這樣它就不能抽象。 – Dogday

+0

我不明白你的意思。爲什麼你需要知道汽車的類型?如果它是一輛汽車,你可以調用汽車的方法。 – GJK

+0

true,但getName方法不同於寶馬和奧迪 – Dogday

0

那麼類CAR可以由一個方法說getName();它設置類屬性$ _carName中的值;

class car { 
protected $_carName; 

protected function getCarName(){ 
    return $this->_carName; 
} 
} 

所以,現在你要做的就是在子類中設置$ _carName和setter函數。而且,無論何時你想獲取汽車名稱,都可以使用每個孩子的classInstance來獲取各自的汽車名稱。

+0

'return $ this - > _carName;' – moonwave99

0

你可以有你的車類,像這樣:

public abstract class Car { 

    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

讓你的寶馬和奧迪繼承你的車,包括這裏的任何寶馬和奧迪的具體名稱:

public class BMW extends Car { 

    private String bmwSpecificName; 

} 

public class Audi extends Car { 

    private String AudiSpecificName; 

} 
-2

至於你說的這是不好的做法,但如果你真的想像你所描述的那樣做,可以這樣做(適用於Java):

//in Audi class 
String methodToGetAudiName(); 

//in BMW class 
String methodToGetBMWName(); 

if (carInstance instanceof Audi) 
stringToStoreName = ((Audi)carInstance).methodToGetAudiName(); 
else if (carInstance instanceof BMW) 
stringToStoreName = ((BMW)carInstance).methodToGetBMWName(); 
+0

但是爲什麼在地球上,他們有一個共同的祖先? – moonwave99

+0

你是對的。但是我明白他希望這樣做,而不必重寫抽象類Car中的方法getName(),或者將其存儲在超類的公共字段中。但是,如果他只是沒有共同領域,我很抱歉建議這種非OOP方式:) – QI3it

+2

對不起,但世界上絕對沒有理由這樣做。如果你能想出一個理由,那只是因爲你的課堂設計很糟糕。如果您發現自己正在做這樣的事情,請刪除您的代碼並重新開始。 – GJK

0

你有抽象類汽車,音響和寶馬。他們被簡化爲解釋。如果你想提取一個對象的名字,你只需調用getName即可。在這個例子中,寶馬或音頻如何存儲名稱並不重要。您可以獲得靜態類型的汽車(可以是寶馬或者音頻中的任意一種),只需撥打getName()即可。

<?php 

abstract class Car { 
    /** 
    * Returns the name of the car. 
    * @return string 
    */ 
    abstract function getName(); 
} 

class BMW extends Car { 
    public function getName() { 
     return 'bmw'; 
    } 
} 

class Audio extends Car { 
    public function getName() { 
     return 'audio'; 
    } 
}