2

次のインターフェースがあるとしましょう

public interface IFilter<T>
{
    IEnumerable<T> ApplyFilter(IEnumerable<T> list);
}

そして、このような特定の実装:

public class PetFilter: IFilter<Dog>, IFilter<Cat>
{
    public IEnumerable<Dog> ApplyFilter(IEnumerable<Dog> list)
    {
         return ApplyFilter<Dog>(list);
    }

    public IEnumerable<Cat> ApplyFilter(IEnumerable<Cat> list)
    {
         return ApplyFilter<Cat>(list);
    }

    private IEnumerable<T> ApplyFilter<T>(IEnumerable<T> list)
    {
         // do the work here
    }
}

同じ実装を共有している場合、Dog と Cat の両方に別々のメソッドを実装する必要を回避する方法はありますか?

4

2 に答える 2

2

はいといいえ。制約なしでジェネリックを使用している場合、コンパイラーは、さまざまなクラスを操作する方法を知る方法がありません (それらが何らかの形で関連していたとしても)。たとえば、ApplyFilter が Cat クラスと Dog クラスの両方で機能することをコンパイラがどのように認識するのでしょうか。それに犬と猫は完全に別物です。

ただし、両方のクラスが同じ基本クラスから継承されていることを考慮すると、共通の基本クラス (またはインターフェイス) を介してそれらを操作できますが、PetFilter クラスもジェネリックである必要があります。

public abstract class Pet
{
}

public class Dog : Pet
{
}

public class Cat : Pet
{

}

以下はジェネリック PetFilter クラスで、IFilter を継承しています。IFilter にはジェネリック制約がありませんが、PetFilter クラスに追加できます。

public class PetFilter<T> : IFilter<T> where T : Pet
{
    public IEnumerable<T> ApplyFilter(IEnumerable<T> list)
    {
        throw new NotImplementedException();
    }
}
于 2013-08-21T10:05:00.733 に答える