4

顧客が車両の仕様を確認できるように、キオスクで車/トラック/バンを表示するシステムをどのように設計するかというインタビューの質問がありました。(警告: 私は最近オブジェクト指向プログラミングをあまり行っていないので、悪い語彙が続く可能性があります)

私は、ホイールベース、ドライブトレイン、馬力などの非常に基本的な特性を備えたクラス、車両から始めたと言いました。次に、それを車、トラック、またはバンにサブクラス化し、トラックの荷台の長さや車のトランク容量など、より具体的な測定値を得ることができます。

次に、オプションを追加する方法を尋ねました。オプションはおそらくどの車両にも存在する可能性があると述べたので、車両にはオプションのリストがあると言えます。

最後に、彼らは、トラックとバンでのみ利用でき、車では利用できないオプションがあるかどうかを尋ねました。私は少し困惑しました. 私が説明したレイアウトを考えると、これをうまく実現する方法はありますか? これを解決するためにクラス階層を設定するより良い方法はありますか? それとも、ロジックを追加しないと簡単に解決できない、より複雑な問題なのでしょうか?

4

3 に答える 3

4

そのシナリオにはいくつかのオプションがあります。

まず、簡単なもの:

オプション #1 - トラック/バン用のインターフェース

トラックとバンのみが Options を実装する場合は、IVehicleOptions というインターフェイスを作成し、トラックとバンにそれを実装させます。

public interface VehicleOptions
{
  Options { get; }
}

これの欠点は、トラックやバンとは異なる方法で車を扱わなければならないことです。

オプション #2 - Null デザイン パターン

ただし、ヌル デザイン パターンを使用することはできます。Car に IVehicleOptions を実装させ、null を返すだけです。

public class Car : IVehicleOptions
{
  public VehicleOptions { get { return null; } }
}

オプション #3 - 戦略パターン

Vehicle のような基本クラスを作成します。

public abstract class Vehicle
{
  public Options Options { get; protected set; }
}

そして、各具象クラスに設定させます:

public class Car : Vehicle
{
  public Car()
  {
    this.Options = NullOptions();  // This is the null design pattern used with this strategy pattern
  }
}

public class Truck : Vehicle
{
  public Truck
  {
    this.Options = SuperOptions();
  }
}

public class Van: Vehicle
{
  public Van
  {
    this.Options = ElegantOptions();
  }
}

これで、すべてのビークルを (ビークルとして) 同じように扱うことができます。

于 2012-04-26T22:45:16.003 に答える
2

1* のようVehicleに拡張する必要があるように抽象化しClass Car extends Vehicleます。

2* すべての抽象メソッドはすべての具体的な子によって実装される必要がありますが、すべてのメソッドは抽象である必要があります。したがって、部分実装を使用してください。

Truck3* したがって、クラスandのオプションが必要であるが は必要ない場合はVanCar実装されたメソッドを で作成しVehicleます。実装されているため、すべての子はそれをオーバーライドする (またはオーバーライドしない) ことができます。

4* インターフェイスを使用することもできます。共有する必要のないインターフェイスを共有する場合がTruckあります。VanCar

しばらく経っているので、次を確認してください: http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

于 2012-04-26T22:40:45.133 に答える
0

バンとトラックには車にはない余分な機能があり、その機能を共通のインターフェースに追加することはできないため、バンとトラックが基本インターフェースを拡張する別のインターフェースを実装するという SOLID 原則の 1 つであるインターフェースを分離することを考えています。言いたいこと:-

Interface IVehicle{
void move();
} 
Interface IVehicleExtra extends IVehicle{
// Have methods for extra features for Van and Truck
void limitSpeedEighty();
}
class Car implements IVehicle{
void move(){
}
}
class Van implements IVehicleExtra{
void move(){
}
void limitSpeedEighty(){
}
}
class Truck implements IVehicleExtra{
void move(){
}
void limitSpeedEighty(){
}
}

私の理解とプレゼンテーションが明確であることを願っています。

于 2013-07-23T17:39:24.217 に答える