ジェネリック オブジェクトを操作するときに、クラスがインターフェイスを拡張したことを要求する方法を理解するのに苦労しています。これを説明するのは難しいと思いますが、ジェネリック オブジェクトを作成するときにクラスとインターフェイスを要求できるようにしたいと考えています。
私が考えることができる最も単純なバージョンを作成しました。うまくいけば、それが私の問題をよりよく説明するでしょう。
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
追加するオブジェクトが extends Base
AND implementsであることをリストで要求したいと思いますIComparable<Base>
。ただし、これはただ 1 つのクラス (およびインターフェイス) であるため、多重継承ではありません。
これを行う方法を知っている人はいますか?
編集
コメントありがとうございます。基本的に答えは 2 種類あります: 中間クラスを作成するか、List<IComparable<Base>>
. 実際に必要なロジックが Base にあるため、#2 はオプションではありません。#1は最も実行可能なオプションであり、私たちがしぶしぶ行っているオプションです. このアプローチの懸念は、実際のクラス階層に追加される混乱と複雑さです。
C# でやりたいことを実行できない場合でも、中間クラスで実行する必要があります。みんな、ありがとう。