C#-在派生类上添加约束

时间:2019-02-21 20:49:09

标签: c#

我有一个看起来像这样的C#类:

public abstract class Department<T> where T : ShoppingItem
{
  protected string Name { get; set; }

  protected string Description { get; set; }
} 

然后,我想从Department派生两个类。这些类中的每一个也必须与ShoppingItem元素一起使用。目前,我有:

public class ClothingDepartment<T> : Department<T> where T : ShoppingItem
{
  ...
}

当我尝试初始化ClothingDepartment时,出现错误。我正在尝试像这样初始化它:

var department = new ClothingDepartment();

我得到的错误是Using the generic type ClothingDepartment<T> requires 1 type arguments。我不明白。

我还想在接口旁边使用约束。但是,我也没有运气。

5 个答案:

答案 0 :(得分:0)

就像错误提示一样,您在实例化类时需要传递类型参数。由于类型参数的限制,您将需要传递ShoppingItem类或从ShoppingItem继承的类。编译器将构建一个ClothingDepartment类,其中所有“ T”引用都将被您传递的ShoppingItem类替换。

在像这样新建类时传递类型参数:

var department = new ClothingDepartment<ShoppingItem>();

答案 1 :(得分:0)

您的课程是通用类,需要派生ShoppingItem类。

var department = new ClothingDepartment<DerivedShoppingItem>();

public class DerivedShoppingItem : ShoppingItem
{
     DerivedShoppingItem() : base()
     {
     }

     ....
}

答案 2 :(得分:0)

如果您不想使用new ClothingDepartment();

,则您的secound类应该如下所示
public class ClothingDepartment : Department<ShoppingItem>
{
  ...
}

答案 3 :(得分:0)

作为将Type传递到ClothingDepartment<T>的type参数中的一种替代方法,您可以直接在Department<T>类定义中指定ClothingDepartment的type参数。例如,如果ClothingDepartment应该始终将Shirt用作ShoppingItem,则可以执行以下操作:

public class ClothingDepartment : Department<Shirt>
{
  ...
}

这将允许您实例化ClothingDepartment,而无需使用类型参数:

var department = new ClothingDepartment();

答案 4 :(得分:0)

使用购物项目创建其他类别,然后可以像以下方式初始化服装部门:

var clothingDepartment = new ClothingDepartment<Shirt>();

public class Shirt : ShoppingItem
{

}