我将以下基本抽象类定义为:
public abstract class BaseObject<T> : IComparable, IComparable<T>, IEquatable<T> {}
我还有一个定义为的接口:
public interface ICode<T> where T : struct
{
T Code { get; }
}
现在我想派生一个继承自BaseObject<T>
的类,并包含接口ICode<T>
。
我试着像那样定义:
public class DerivedObject<T, U> : BaseObject<T>, ICode<U> where T : DerivedObject<T, U> where U : struct
{
public DerivedObject(U code)
{
Code = code;
}
// From BaseObject
protected override int InstanceCompareTo(T obj)
{
return Code.CompareTo(obj.Code);
}
// From BaseObject
protected override bool InstanceEquals(T obj)
{
return Code.Equals(obj.Code);
}
// From ICode
U _Code;
public U Code
{
get { return _Code; }
protected set { _Code = value; }
}
}
来自编译器的唯一错误是Code.CompareTo(obj.Code)
带有消息:
'U'不包含'CompareTo'的定义,也没有扩展方法'CompareTo'接受类型'U'的第一个参数。
但U
是值类型,应该知道CompareTo
。
你知道我做错了什么,或者我做错了什么?
我的最终目标是推导出这样的课程:
public class Account : DerivedObject<Account, int>
public class ItemGroup : DerivedObject<ItemGroup, string>
非常感谢提前!
答案 0 :(得分:2)
但是U是值类型,应该知道 的CompareTo。
啊 - 不。 Jusst因为U是一个值类型并不意味着它必须有COmpareTo,并且&#34;应该知道&#34;你说的是什么,但没有提到你的班级定义。
要求U也实现IComparable和&#34;应该知道&#34;是编译器可以理解的东西。 CompareTo不是struct的属性,但因为所有主要结构都实现了IComparable。
答案 1 :(得分:2)
struct
类型没有必要使用CompareTo
方法。您必须使用约束来强制执行它:
public class DerivedObject<T, U> : BaseObject<T>, ICode<U>
where T : DerivedObject<T, U>
where U : struct, IComparable<U> {}
CompareTo
方法是IComparable<T>
合同的一部分。它与U
作为值类型无关。这就是为什么你必须添加一个通用约束,表明U
是IComparable<U>
。