使用类和接口定义通用对象

Mer*_*wer 4 c# generics inheritance

我在查找如何在处理泛型对象时要求类扩展了接口时遇到了一些麻烦.我发现这很难解释,但我希望能够在创建通用对象时需要一个类和一个接口.

我已经创造了我能想到的最简单的版本 - 希望能够比我能更好地解释我的问题.

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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

从代码中的内联注释中可以看出,我希望列表BigList要求添加的对象扩展Base AND实现IComparable<Base>.这不是真正的多重继承,因为它只是一个类(和一个接口).

有谁知道这样做的方法?

编辑

感谢大家的评论.基本上答案有两种:创建一个中级类,或使用List<IComparable<Base>>.#2不是一个选项,因为我们确实需要Base中的逻辑.#1是最可行的选择,也是我们勉强接受的选择.这种方法的关注点是它将在实际的类层次结构中添加的混乱和复杂程度.

无论C#不会让我们做我们想做的事情,我们都必须使用中间类.感谢大家.

Pao*_*sco 7

那这个呢:

abstract class Base {
}

abstract class Intermediate : Base, IComparable<Base> {
}

class Class1 : Intermediate {
}

class Class2 : Intermediate {
}

class Class3 : Base {
}

public static List<Intermediate> BigList = new List<Intermediate>();
BigList.Add(new Class1()); // ok
BigList.Add(new Class2()); // ok
BigList.Add(new Class3()); // error
Run Code Online (Sandbox Code Playgroud)

当然,只有当你需要实现类Base而不是IComparable<Base>,否则这是必要的,否则你只能声明Base

abstract class Base : IComparable<Base> {
}
Run Code Online (Sandbox Code Playgroud)