2

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()これで、2 つのメソッドの実装は同じになります。

今、私は2つの問題を抱えています、

  1. コードの繰り返し(重複)がある
  2. changeTyre(Car,Tyre)メソッドを含むスーパークラスを持つことは意味がないようです

この種の状況はどのように処理されましたか?

4

3 に答える 3

3

継承よりも構成を使用して拡張するために (ウィリーの答え)、ChangeTyre のような使用についてのコメントで正しい方向に進んでいたと思いますcar.ChangeTyre(Tyre)

各メカニックまたはドライバーは車に関連付けられるため、 Car プロパティを持つことができます -

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);
    }
}

Driver と Mechanic の方法は同じかもしれませchangeTyreんが、タイヤを交換する実際のロジックは 1 か所に存在します。メカニックはドライバーではなく、継承は「is-a」関係をサポートするため、継承は機能しないと思います。changeTyrePerson から継承するすべてのクラスがメソッドを持つ必要があるわけではないため、スーパークラス (Person など)に強制することは意味がない場合がありchangeTyreます。継承に対する構成の詳細については、この質問を参照してください。

于 2012-07-24T13:24:59.643 に答える
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)
} 

これを行う !

そうすれば、1 つのクラスにコードとコントロールが重複することはありません。また、関数のすべてのリストを作成して、特定の関数をクラスに追加することもできます。

于 2012-07-24T12:59:29.027 に答える
0

Mechanic は実際には Driver から継承する必要があることをお勧めします。これは、あなたのコンテキストでは、ドライバーがメカニックにできることは何でもできる (つまり、テストのために車を運転する) と推測しているためです。

changeTyre メソッドは、実装が異なる (ツールが異なるなど) 可能性があるため、Mechanic によってオーバーライドできるように仮想化する必要があります。

また、一部の要素をインターフェイス (運転方法、車のメンテナンス方法など) に分離することをお勧めします。

于 2012-07-24T12:59:46.240 に答える