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-コードは拡張のためにオープンで、変更のためにクローズである必要があります)、コーチをサポートするためにクラスを変更する必要があるため、クラスでは達成できませんでした。CoachAdapter
CarAdapter
TruckAdapter
Vehicle