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 回答
2

是的,鉴于这Dog两者Cat都继承自一个公共基类或实现一个公共接口,例如IAnimal。然后例如:

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

换句话说,如果CatDog共享过滤逻辑,它肯定是指一个共同的基础。

于 2013-08-21T09:51:31.993 回答