У меня возникли проблемы с выяснением того, как требовать от класса расширенного интерфейса при работе с общими объектами. Я считаю, что это трудно объяснить, но я хочу, чтобы для создания моего общего объекта был необходим интерфейс класса &.Определение общих объектов с классом и интерфейсом
Я создал простейшую версию этого, о которой я могу думать - надеюсь, это объяснит мою проблему лучше, чем я могу.
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
И реализует IComparable<Base>
. На самом деле это не множественное наследование, потому что это только один класс (и интерфейс).
Кто-нибудь знает, как это сделать?
EDIT
Спасибо за комментарии всех. В основном ответы приходят в двух вариантах: создайте промежуточный класс или используйте List<IComparable<Base>>
. # 2 - это не вариант, потому что в базе есть логика, которая нам действительно нужна. # 1 - самый жизнеспособный вариант, и тот, который мы неохотно, идущий с. Забота об этом подходе заключается в количестве беспорядка и сложности, которые будут добавлены в фактическую иерархию классов.
Независимо от того, если C# не позволит нам делать то, что мы хотим сделать, нам придется делать это с промежуточными классами. Всем спасибо.
То, что вы хотите, не представляется возможным без создания вашего собственную структуру данных, реорганизацию иерархии классов или создание вспомогательного метода Add(). Почему бы вам не сделать свой BigList типа List>()? –
Osiris
// Это не должно допускаться, потому что Class2 не расширяет IComparable >>> class Class2: Base, IComparable er я ненавижу его разбивать, но класс 2 действительно расширяет его;) класс 3, однако, не –
RhysW
@ Осирис: Довольно много суммирует мои мысли. –