在使用泛型对象时,我在弄清楚如何要求类扩展接口时遇到了一些麻烦。我发现这很难解释,但我希望在创建我的通用对象时能够需要一个类和一个接口。
我已经创建了我能想到的最简单的版本——希望这能比我能更好地解释我的问题。
abstract class Base
{}
class Class1 : Base, IComparable<Base>
{
public int CompareTo(Base other)
{
return GetHashCode().CompareTo(other.GetHashCode());
}
}
class Class2 : Base, IComparable<Base>
{
public int CompareTo(Base other)
{
return GetHashCode().CompareTo(other.GetHashCode());
}
}
class Class3 : Base
{}
class Program
{
// This list should only accept objects that extend (Base & IComparable<Base>)
public static List<Base> BigList = new List<Base>();
static void Main(string[] args)
{
Class1 c1 = new Class1();
Class2 c2 = new Class2();
Class3 c3 = new Class3();
BigList.Add(c1);
BigList.Add(c2);
// This should not be allowed because Class3 does not extend IComparable<Base>
BigList.Add(c3);
Check(new Class1());
}
public static void Check(Base bb)
{
foreach (Base b in BigList)
{
// Assert that this is true
IComparable<Base> c = (IComparable<Base>)b;
if (c.CompareTo(bb) < 0)
Console.WriteLine("Less Than");
else if (c.CompareTo(bb) == 0)
Console.WriteLine("Equal");
else if (c.CompareTo(bb) > 0)
Console.WriteLine("Greater Than");
}
}
}
正如您从代码中的内联注释中看到的那样,我希望该列表BigList
要求添加的对象扩展Base
AND实现IComparable<Base>
。这并不是真正的多重继承,因为它只是一个类(和一个接口)。
有谁知道这样做的方法?
编辑
感谢大家的评论。基本上答案有两种形式:创建一个中级类,或者使用List<IComparable<Base>>
. #2 不是一个选项,因为 Base 中有我们确实需要的逻辑。#1 是最可行的选择,也是我们不情愿的选择。这种方法的问题是这将在实际的类层次结构中增加的混乱和复杂性。
不管 C# 是否不允许我们做我们想做的事,那么我们将不得不使用中间类来做。谢谢大家。