継承以外はシナリオ依存。優れた例を含むこのコード プロジェクトの記事を確認してください。
【記事より】
3 つのクラスを作成する必要があるとします。最初は CAR、2 番目は MAN、3 番目は WOMAN です。次に、それらの移動方法を定義するために、それぞれに関数が必要です。これで 3 つすべてが移動できるようになりましたが、CAR は MAN と WOMAN とはまったく異なる方法で移動します。したがって、ここでは Interface IMOVEMENT を使用し、関数 MOVE を宣言します。これで、3 つのクラスすべてがこのインターフェイスを継承できます。というわけで、授業はこんな感じ。
public interface IMovement
{
void Move();
}
public class Car : IMovement
{
public void Move()
{
//Provide Implementation
}
}
public class Man : IMovement
{
public void Move()
{
//Provide Implementation
}
}
public class Woman : IMovement
{
public void Move()
{
//Provide Implementation
}
}
しかし、MAN と WOMAN は同じように歩くため、2 つの異なる方法で同じ動作を提供することはコードの冗長性になります。簡単に言えば、コードは再利用されません。したがって、人間の動きの抽象クラスを定義できるようになり、このクラスを HUMANBEINGMOVEMENT にすることができます。また、同じことが CAR クラスにも適用できます。自動車には多くのメーカーがあり、すべての自動車が同じように動くため、CARSMOVEMENT である自動車の動きの抽象クラスを定義することもできます。したがって、リファクタリングされたコードは .
public interface IMovement
{
void Move();
}
public abstract class CarsMovement : IMovement
{
public virtual void Move()
{
//default behavior for cars movement
}
}
public class SuzukiCar : CarsMovement
{
public override void Move()
{
//Provide Implementation
}
}
public abstract class HumanBeingMovement : IMovement
{
public virtual void Move()
{
//default behavior for human being movement
}
}
public class Man : HumanBeingMovement
{
public override void Move()
{
//Provide Implementation
}
}
public class Woman : HumanBeingMovement
{
public override void Move()
{
//Provide Implementation
}
}