1

シナリオ

これは決して現実的ではないので、一粒の塩で例を挙げてみましょう。シナリオを簡単に伝えるためのものです。そうは言っても、次のクラス定義があるとしましょう。

interface iVehicle {
   public function getDescriptionFormat1();
   public function getDescriptionFormat2(); 
}

class VehicleDescription {
   ...
}

class TruckDescription extends VehicleDescription implements iVehicle {
  ... 
}

class CarDescription extends VehicleDescription implements iVehicle {
  ...
}

問題

クラス CarDescription および TruckDescription は、記述形式の一方または両方を実装できます。1 つだけが必要な場合に、両方のクラスで両方のメソッドをオーバーライドするのは間違っているようです。そのような制限を実装する適切な方法は何ですか? または、それが悪い設計上の決定であるという事実を私に売り込むこともできます.

編集- 私の例では少しあいまいすぎたのではないかと思います。謝罪いたします。2 つの記述は、文字列ではなく、多かれ少なかれ異なるデータ構造です。1 つは長さ 3 列の詳細な説明を表す配列を返す場合があり、もう 1 つは 2 列のより基本的な説明テーブルを返す場合があります。

4

4 に答える 4

1

インターフェイスはコントラクトと見なすことができます。そのインターフェイスを実装するクラスは、指定された関数を提供することを保証します。

ただし、これを実際にどのように行うかは、完全に実装クラス次第です。あなたの例TruckDescriptionCarDescriptionは、さまざまな理由でさまざまな説明形式を返す必要がある場合があるため、getDescriptionFormat1()&getDescriptionFormat2()をさまざまな方法で実装します。

基本的には、おそらくインターフェイスで必要なだけgetDescriptionFormat()で、実装クラスが必要に応じて関数を実装できることを意味します。

返されるものを標準化する必要があるかのように聞こえます。おそらく、説明をカプセル化できるフォーマットクラスでしょうか? 詳細が分からないので推測ですが、その通りだと思います。

于 2013-05-15T22:00:31.697 に答える
0

これが私がこれに取り組む方法です。

interface Describable {
   public function getDescription(); 
}

interface Sellable {
    public function getPrice();
}

// abstract class - can't create an instance but can hold shared methods and property definitions
abstract class Vehicle implements Describable, Sellable {
    abstract public function getDescription();

    // this can't be overloaded
    final public function getPrice(){
        // code for get price
    }
    public function getColorOptions(){
        // this can be overloaded
    }
}

// concrete class that just uses the abstracts' definitions
class Car extends Vehicle {
    public function getDescription(){
        // overload for cars
    }
}

// concrete class that overloads one of the properties
class Truck extends Vehicle {
    public function getDescription(){
        // overload for trucks
    } 
}


class FlyingCar extends Car {
    public function getDescription(){
        // Flying cars need a whole new description
    }

}

基本的に、これはオーバーロードする必要があるメソッドを示しています(抽象として定義されているため、getDescription)

オーバーロードできないもの (最終的に定義されていることによる getPrice)

もう 1 つは、アブストラクトで定義され、オーバーロードするか、デフォルトの実装を使用することができます。

于 2013-05-15T22:15:54.407 に答える