作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有以下界面
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 类?对它来说,狗和猫是完全不同的东西。
但是考虑到您的两个类都继承自同一个基类,您可以通过它们的公共(public)基类(或接口(interface))对它们进行操作,但是您的 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();
}
}
关于c# - 实现多个泛型类型的泛型接口(interface)——如何共享一个方法实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18354075/
我是一名优秀的程序员,十分优秀!