1

私は、アルゴリズムが動作するオブジェクトに対してそれぞれ独自のクラス タイプを持つ 2 つの異なるチームによって使用されるアルゴリズムに取り組んでいます。2 つのクラス間でできるだけ多くのアルゴリズム コードを共通にすることで、重複を減らしたいと考えています。

より具体的に説明するために、車とトラックの両方で動作する必要がある Drive() というアルゴリズムを作成しているとします。残念ながら、Truck と Car の両方が継承する Vehicle クラスはありませんが、Truck と Car の両方が、Drive アルゴリズムが必要とするすべてのメソッドとクラス メンバーへのアクセスを提供します。これらの外部チームに、継承元のクラスについて同意を得ることができる可能性は低いようです。

このような状況への最善のアプローチは何ですか?

私の現在の考えは、車またはトラックのいずれかを保持できる 3 番目のクラスの車両を作成し、アルゴリズムに必要なクラス メンバー/メソッドへの呼び出しを渡すことです。

4

3 に答える 3

3

継承の代わりに、これはインターフェースの完璧なユースケースです。必要なメソッドを定義するインターフェースを使用することに両方のチームに同意してもらうことができる場合があります。ドライブメソッドに必要なメソッドを定義するIVehicleインターフェイスがあります。次に、具体的なタイプではなくIVehicleを受け入れるようにメソッドを設定します。

于 2012-11-10T18:46:11.863 に答える
1

C# 動的型を使用するのに最適な場所のように思えます。

ドライブに動的パラメーターを取り、車とトラックを渡すだけです。

于 2012-11-10T18:38:02.313 に答える
0

2つのクラスが同じアセンブリ内にある場合は、2つの別々のチームに、両方のクラスが使用する共通のインターフェイスについて合意するように依頼できます。これにより、コードを依存させることができます。クラスが異なるアセンブリにあるが、両方が別の共通アセンブリを参照している場合、インターフェイスは代わりにそのアセンブリに存在する可能性があります。

もう1つの方法は、アダプターパターンを使用することです。これは、使用するdynamic場合、またはチームがインターフェイス自体に同意しない場合に、より適切なアプローチになります。これを行うには、共通のインターフェースと、それを実装するクラスを作成します。これにより、呼び出しを特注の実装に転送できます。

public interface IVehicle
{
    void Turn(); // specify all the methods and properties you need here.
}

public class CarAdapter : IVehicle
{
    private Car car;

    public CarAdapter(Car car)
    {
        this.car = car;
    }

    public void Turn()
    {
        this.car.Turn();
    }
}

public class TruckAdapter : IVehicle
{
    private Truck truck;

    public TruckAdapter(Truck truck)
    {
        this.truck = truck;
    }

    public void Turn()
    {
        this.truck.Turn();
    }
}

あなたのコードはそれからただ必要ですIVehicle

public void Drive(IVehicle vehicle) { ... }

そして、このように呼び出すことができます:

Drive(new CarAdapter(car));
//or
Drive(new TruckAdapter(truck));

このアプローチの利点は、CarとTruckのプロパティ、メソッド名、引数などがわずかに異なる可能性IVehicleがあることですが、これをアダプターにカプセル化することで、コードがに対してプログラムするだけです。Vehicleこれは、を受け入れるシングルを作成するよりも優れています。CarまたはTruck、将来的に3番目のクラスが必要な場合(たとえばCoach)、OCP(Open Closed Principle-コードは拡張のためにオープンで、変更のためにクローズである必要があります)、コーチをサポートするためにクラスを変更する必要があるため、クラスでは達成できませんでした。CoachAdapterCarAdapterTruckAdapterVehicle

于 2012-11-10T19:08:51.173 に答える