我正在尝试在我的 C# 项目中实现接口继承系统,但无法让它工作。
这是一个简化版本:
public interface BaseInterface {}
public abstract class AbstractClass<T> where T : BaseInterface {}
public interface ChildInterface : BaseInterface {}
public class ConcreteClass : AbstractClass<ChildInterface> {}
我想按如下方式使用它:
AbstractClass<BaseInterface> c = new ConcreteClass();
最后一行代码给我以下错误:
无法将类型“ConcreteClass”隐式转换为“AbstractClass”
为什么转换不可能?
让我们尝试一下您的类型并给它们起不同的名字。
public interface IFruit { }
public abstract class BowlOf<Fruit> where Fruit : IFruit
{
public void Add(Fruit fruit) { }
}
public class Apple : IFruit { }
public class BowlOfApples : BowlOf<Apple> { }
现在,这样 - 这几乎只是类型的重命名(但是改变public interface ChildInterface : BaseInterface {}
to public class Apple : IFruit { }
)然后我们创建以下问题。
假设我有public class Banana : IFruit { }
另外,我们假设以下内容是合法的:
BowlOf<IFruit> c = new BowlOfApples();
那我就可以打电话了c.Add(new Banana())
。什么!?!你不能在一碗苹果中添加一根香蕉。
这就是为什么当你尝试这样做时编译器会抱怨AbstractClass<BaseInterface> c = new ConcreteClass();
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)