gpt4 book ai didi

c# - 使用类和接口(interface)定义通用对象

转载 作者:太空狗 更新时间:2023-10-30 00:43:34 24 4
gpt4 key购买 nike

我在弄清楚如何在处理通用对象时要求一个类扩展了一个接口(interface)时遇到了一些麻烦。我发现这很难解释,但我希望在创建我的通用对象时能够需要一个类和一个接口(interface)。

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

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> .这并不是真正的多重继承,因为它只是一个类(和一个接口(interface))。

有谁知道这样做的方法吗?

编辑

感谢大家的评论。基本上答案有两种:创建一个中级类,或使用 List<IComparable<Base>> . #2 不是一个选项,因为 Base 中有我们实际需要的逻辑。 #1 是最可行的选项,也是我们勉强采用的选项。这种方法的问题是这会在实际的类层次结构中增加困惑和复杂性。

无论 C# 是否不允许我们做我们想做的事情,我们都必须使用中间类来完成。谢谢大家。

最佳答案

这个怎么样:

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

当然,这只有在您需要让类实现 Base 时才有必要但不是 IComparable<Base> , 否则你可以声明 Base作为

abstract class Base : IComparable<Base> {
}

关于c# - 使用类和接口(interface)定义通用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10554102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com