.NET:类定义说明

时间:2016-01-07 14:47:48

标签: c# asp.net inheritance

我理解基本的继承,我理解泛型的基础知识。

但我不明白这个类的定义:

public class ExportController : AbstractFeedController<IExportFeed>

ExportController继承AbstractFeedController ...

但是,<IExportFeed>做什么/意味着什么?这与仿制药有关吗?

5 个答案:

答案 0 :(得分:4)

An Introduction to C# GenericsInheritance 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)

继承的类隐式定义泛型类的类型。

因此继承的类不再是通用的,并且使用所提供类型的基类。