实现多个泛型类型的泛型接口-如何共享方法实现

本文关键字:实现 共享 方法 何共享 泛型类型 泛型接口 | 更新日期: 2023-09-27 18:28:37

假设我有以下接口

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共享相同的实现方式,有什么方法可以避免它们必须同时实现不同的方法吗?

实现多个泛型类型的泛型接口-如何共享方法实现

是和否。当您在没有任何约束的情况下使用泛型时,编译器将无法知道如何对不同的类进行操作(即使它们在某种程度上是相关的)。例如,编译器如何知道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();
    }
}

是的,假设DogCat都继承自一个公共基类或实现一个公共接口,例如IAnimal。例如:

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

换言之,如果CatDog共享过滤逻辑,那么它肯定是指一个公共的基础。