0

私はOOPで大丈夫だと思っていましたが、つまずきにぶつかったようです。

この例では、Car と BMW と Audi があります。Car には一連の動作があり、BMW と Audi は個別に off Car を継承します。

- -車 - -
| | ----- |
----------
BMW --- アウディ

ユーザーがオブジェクトを作成するとき、子クラス (new BMW など) を介してこれを行います。BMW にはさまざまな属性があり、これらの属性を取得および保存する方法が異なるため、これで問題ありません。ただし、次の画面では Car (BMW または Audi のいずれか) を表示したいので、基本的にここでは Car->getName() を実行します。たとえば、BMW の名前は Audi の名前とは異なる方法で保存されることに注意してください。どうすればこれを達成できますか? ケースステートメントを使用できますが、これは良い習慣ではないと思うので、実際には使用したくありません。何か案は?

4

5 に答える 5

1

getName()抽象メソッドを作成する必要があります。インスタンスCar化できないように抽象クラスを作成します。次に、AudiおよびBMWサブクラスで、getName()メソッドをオーバーライドして名前を正しく返します。

これはすべて Java を想定していますが、PHP にも同様の OOP 概念があると確信しています。

編集:工場が必要なようです。まず、Car を抽象化します。次に、このメソッドをどこかに配置します (Car の静的メソッドのように)。

public Car carFactory(DB database) {
    if (DB.shouldMakeAudi()) {
        return new Audi();
    } else if (DB.shouldMakeBMW()) {
        return new BMW();
    } else {
        return null;
    }
}
于 2013-06-01T19:55:54.710 に答える
0

クラス CAR は getName(); などのメソッドで構成できます。クラス プロパティ $_carName に値を設定します。

class car {
 protected $_carName;

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

そのため、子クラス内のセッター関数で $_carName を設定します。また、carname を取得したいときはいつでも、各子 classInstance を使用してそれぞれの carname を取得できます。

于 2013-06-01T19:59:52.913 に答える
0

Car、Audio、および BMW の抽象クラスがあります。説明のために簡略化しています。オブジェクトの名前を抽出したい場合は、getName を呼び出すだけです。この例では、名前が BMW または Audio によって内部的にどのように保存されているかはまったく問題ではありません。静的タイプ Car (実際のタイプは BMW または Audio のいずれか) のオブジェクトを取得し、単に を呼び出します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';
    }
}
于 2013-07-25T13:38:43.047 に答える
-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();
于 2013-06-01T20:05:04.583 に答える