11

抽象基本クラスとして Engine というクラスがあるとします。そこから派生した ElectrictEngine および FuelEngine クラスもあります。

エンジンに燃料を補給する方法を作りたい。基本クラス レベルで抽象メソッドとして実行し、fillUpEnergy などの一般的な方法で名前を付ける必要がありますか?

問題は、電気エンジンを使用している場合、メソッドが受け取るパラメーターの数が、燃料エンジンに渡す必要があるパラメーターの数と異なることです。したがって、メソッドのシグネチャは異なります。

さらに、両方のエンジンに汎用メソッドを使用するが、より具体的な名前でラップするスマートな方法はありますか? 例: 燃料エンジンの場合は「refuel」、電気エンジンの場合は「chargeBattery」? 同時に、一般的なメソッドをユーザーから隠しますか?

4

5 に答える 5

6

この状況では、次のようなものが得られるように、抽象クラスのジェネリック実装を定義します。

public abstract class EngineBase<T>
{
     public abstract void Refuel(T parameters);
}

次に、実装は次のようになります。

public class ElectricEngine : EngineBase<ElectricParameters>
{
     public override void Refuel(ElectricParameters parameters) { }
}

または、インターフェースを定義して、特定の実装をメソッドに渡すこともできます。

public abstract class EngineBase
{
     public abstract void Refuel(IRefuelParameters parameters);
}

次に、実装は次のようになります。

public class ElectricEngine : EngineBase
{
     public override void Refuel(IRefuelParameters parameters)
     {
          if(!(parameters is ElectricParameters))
              throw ApplicationException("Not the right params!");

          ElectricParameters rightParams = parameters as ElectricParameters;
     }
}
于 2011-04-08T15:17:43.157 に答える
2

これらのクラスをどのように使用するかをもっと考えてください。クライアントが自分が扱っているエンジンの種類がわからない場合、つまり「エンジン」を持っている場合は、両方が使用できる「燃料補給」シグネチャを把握する必要があります。一方、給油の種類ごとに異なる引数が必要な場合は、基本クラスでは何もできず、代わりにクライアントにエンジンの種類を知らせて正しい引数を渡す必要があります。

于 2011-04-08T15:15:20.190 に答える
2

インターフェイスを使用して燃料を補給する方法はありますか?

eg
public void Refuel(IFuel fuel)
{
//do refueling logic
}

2 種類の燃料補給にはどのようなパラメータが必要ですか?

于 2011-04-08T15:15:37.367 に答える
0

エンジンと給油可能/充電可能部品を分離します。または、エンジンに関するすべてのことを一般化する必要があります。たとえば、別の抽象型 (またはインターフェイス)Chargeを作成し、これをrechargeメソッド (親抽象Engineクラスで定義されている) に渡すことができます。コードが必要な場合はお知らせください。

于 2011-04-08T15:23:07.880 に答える