我有这3个抽象类:
public abstract class DataObject {}
public abstract class BusinessObject<T> where T : DataObject {}
public abstract class UIObject<T> where T : BusinessObject<DataObject> {}
我能够创建 CustomerDataObject ,它源自DataObject
, CustomerBusinessObject ,源自BusinessObject<CustomerDataObject>
,但我无法创建 CustomerUIObject 类:
类型
CustomerBusinessObject
不能用作类型参数T
在通用类型或方法UIObject<T>
中。没有隐含的 引用从CustomerBusinessObject
转换为BusinessObject<DataObject>
。
我做错了什么?
答案 0 :(得分:2)
您明确声明UIObject
的T继承BusinessObject<DataObject>
但您的类型CustomerBusinessObject
实际上继承了BusinessObject<CustomerDataObject>
,这是另一种类型。
您可以CustomerBusinessObject
继承BusinessObject<DataObject>
但是在实施中始终使用CustomerDataObject
吗?这样可以解决这个错误,但可能不是你想要的。
public class CustomerBusinessObject : BusinessObject<DataObject> { }
答案 1 :(得分:2)
对于Why
- 您已经知道了
现在有一种方法可以做到 - 不改变逻辑:
您可以添加 double 约束:
public abstract class DataObject {}
public abstract class BusinessObject<T> where T : DataObject {}
public abstract class UIObject<T,U> where T : BusinessObject<U> where U:DataObject {}
通过这种方式,您明确告诉编译器U
可以是从DataObject
派生的类型 - 这正是您的CustomerDataObject
。
但你需要添加:
class CustomerDataObject:DataObject
{}
class CustomerBusinessObject :BusinessObject<CustomerDataObject>
{}
class CustomerUIObject :UIObject<CustomerBusinessObject,CustomerDataObject>
{}
这样您就可以指定继承自CustomerDataObject
的{{1}},这正是您在第一时间的意思
答案 2 :(得分:1)
你必须使用Generics约束来解决这个问题。
public abstract class UIObject<T,U> where T : BusinessObject<U>