假设我有以下界面
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实现单独的方法,因为它们共享相同的实现?
答案 0 :(得分:2)
是的,假设Dog
和Cat
都从公共基类继承或实现了一个公共接口,例如: IAnimal
。然后例如:
private IEnumerable<T> ApplyFilter(IEnumerable<T> list)
where T:IAnimal
{
// do the work here
}
换句话说,如果Cat
和Dog
共享过滤逻辑,它肯定会引用一个共同的基础。
答案 1 :(得分: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();
}
}