物品类别
public class Item
{
public bool Check(int value) { ... }
}
具有泛型类型约束的基本抽象类
public abstract class ClassBase<TItem>
where TItem : Item
{
protected IList<TItem> items;
public ClassBase(IEnumerable<TItem> items)
{
this.items = items.ToList();
}
public abstract bool CheckAll(int value);
}
没有约束的继承类
public class MyClass<TItem> : ClassBase<TItem>
{
public override bool CheckAll(int value)
{
bool result = true;
foreach(TItem item in this.items)
{
if (!item.Check(value)) // this doesn't work
{
result = false;
break;
}
}
return result;
}
}
我想知道为什么泛型类型约束不能继承?因为如果我的继承类继承自基类并传递其对基类有约束的泛型类型,则它自动意味着继承类中的泛型类型应该具有相同的约束,而无需显式定义它。不应该吗?
我做错了什么,理解错了,还是泛型类型约束真的不可继承?如果后者是真的,那世界上为什么会这样呢?
一点补充说明
为什么我认为在一个类上定义的泛型类型约束应该在子类上继承或强制执行?让我给你一些额外的代码,让它不那么明显。
假设我们拥有上述所有三个类。然后我们也有这个类:
public class DanteItem
{
public string ConvertHellLevel(int value) { ... }
}
正如我们所看到的,这个类不继承自,Item
因此它不能用作具体类ClassBase<DanteItem>
(暂时忘记它是抽象的事实ClassBase
。它也可以是一个常规类)。由于MyClass
没有为其泛型类型定义任何约束,因此拥有MyClass<DanteItem>
...
但。这就是为什么我认为泛型类型约束应该像成员泛型类型约束一样在继承的类上继承/强制执行,因为如果我们查看MyClass
它的定义:
MyClass<T> : ClassBase<T>
T
什么时候DanteItem
我们可以看到它不能自动使用,MyClass
因为它继承自ClassBase<T>
并且DanteItem
不满足其泛型类型约束。我可以说 **generic type onMyClass
取决于ClassBase
泛型类型约束,因为否则MyClass
可以用任何类型实例化。但我们知道这是不可能的。
当我MyClass
定义为:
public class MyClass<T> : ClassBase<Item>
在这种情况下, T 与基类的泛型类型没有任何关系,因此它独立于它。
这都是有点长的解释/推理。我可以简单地总结为:
如果我们不为其提供泛型类型约束,
MyClass
则隐含地暗示我们可以MyClass
使用任何具体类型进行实例化。但我们知道这是不可能的,因为MyClass
它继承自ClassBase
并且具有泛型类型约束。
我希望这现在更有意义。