この状況は何度も起こりましたが、解決方法がわかりません。
インターフェイス分離の原則は、一部のインターフェイス実装がその機能を使用しない状況を防ぐために作成されました-それは明らかです。インターフェースのリストがあり、それらを使って何かをしたいという状況がよくあります。ISP なしの例を見てみましょう:
public interface IPerson
{
void Run();
void Eat();
}
public class AbcPerson : IPerson
{
void Run(){};
void Eat(){};
}
public class XyzPerson : IPerson
{
void Run(){};
void Eat(){};
}
List<IPerson> People {get;set;}
そして、すべての人と走りたい。
foreach(var person in People)
{
person.Run();
}
今はみんなと一緒に食べたいです。
foreach(var person in People)
{
person.Eat();
}
ISP を使用する場合は、コードを次のように変更する必要があります。
public interface IRunnable
{
void Run();
}
public interface IEatable
{
void Eat();
}
public class AbcPerson : IRunnable,IEatable
{
void Run(){};
void Eat(){};
}
public class XyzPerson : IRunnable,IEatable
{
void Run(){};
void Eat(){};
}
人のリストはどのように作成すればよいですか? Runable と Eatable の 2 つのリストを作成してオブジェクトを追加する必要がありますか (醜い)、または 2 番目のアプローチ - 1 つのリストを作成し、可能であればそれらをキャストする必要がありますか (醜い)? それを行うための最良の規則が何であるかはわかりません。
この例は、私が想像できる最良の例ではないかもしれませんが、私の言いたいことを理解していただければ幸いです。
編集: インターフェイスとクラス、およびプリンシパル名を変更しました。