我理解基本的继承,我理解泛型的基础知识。
但我不明白这个类的定义:
public class ExportController : AbstractFeedController<IExportFeed>
ExportController
继承AbstractFeedController
...
但是,<IExportFeed>
做什么/意味着什么?这与仿制药有关吗?
答案 0 :(得分:4)
An Introduction to C# Generics章Inheritance and Generics:
从泛型基类派生时,必须提供类型参数而不是基类的泛型类型参数:
public class BaseClass<T>
{...}
public class SubClass : BaseClass<int>
{...}
如果子类是通用的,而不是具体的类型参数,则可以使用子类泛型类型参数作为通用基类的指定类型:
public class SubClass<T> : BaseClass<T>
{...}
这意味着您的班级ExportController
不再是通用的,而是派生自班级AbstractFeedController<IExportFeed>
。
答案 1 :(得分:2)
简单来说,这意味着ExportController
派生于封闭的泛型类AbstractFeedController<IExportFeed>
。 AbstractFeedController
类具有一些方法,属性,字段,索引器等,其类型或返回类型或参数类型可以是IExportFeed
类型。
所以AbstractFeedController类可能看起来像这样
//This is a open type:
public class AbstractFeedController <T>
{
T[] m_Items;
public void Feed(T item)
{...}
public T ReturnFeed()
{...}
}
现在我们通过将IExportFeed
作为泛型类型参数
AbstractFeedController feedController = new AbstractFeedController<IExportFeed>();
因此,课程内部翻译如下:
//This is a closed type now:
public class AbstractFeedController <IExportFeed>
{
IExportFeed[] m_Items; //Indexer type of IExportFeed
public void Feed(IExportFeed item) //A method accepting a parameter of type IExportFeed
{...}
public IExportFeed ReturnFeed() //A method returning type of IExportFeed
{...}
}
答案 2 :(得分:2)
是的,这是一个通用的定义。简而言之,AbstractFeedController
定义了一个通用实现,可以应用于各种类型,包括IExportFeed
。
查看类AbstractFeedController
的定义,您可能会看到类似
class AbstractFeedController<T>{ ...
在课程中,您将看到多次使用的类型T
。每当你看到这个T
时,你可以用你认为可以应用的任何类型交换它。
在课程定义中,您可能还会看到where T : ...
。这是类型T
上的条件,限制了类可以使用的类型类型。
阅读this MSDN Article以获得深入解释。
答案 3 :(得分:1)
想象一下像
这样的情况public class ExportController : IExportFeed
public class ImportController : IImportFeed
让我们假设在出口案例中,我们为IExportFeed的所有实施者提供了一些共同的操作。因此可以将这些操作移动到IExportFeed层次结构的一些基本抽象类中。 对于IImportFeed也是如此。
但是如果我们对这两个层次结构都有一些共同的操作呢? 我们可以做类似
的事情 public abstract class ImportExportController : IExportFeed, IImportFeed
并从此继承导出或导入类。
但是这个设计打破了最低限度的SOLID原则,如果您决定添加anoter feed接口,它会变得一团糟
解决方案是将此常见的层次结构功能移动到通用(模板)
public class ExportController : AbstractFeedController<IExportFeed>
public class ImportController : AbstractFeedController<IImportFeed>
等
答案 4 :(得分:0)
继承的类隐式定义泛型类的类型。
因此继承的类不再是通用的,并且使用所提供类型的基类。