Здравствуйте, Jolly Roger, Вы писали:
KA>>Поэтому путь через переопределение стандартного метода Equals и GetHashCode — это слишком громоздко.
KA>>Есть ли способ попроще?
JR>Есть, но о нём Вам уже говорили — class Container<T> : List<T> where T: Super. Либо интерфейс. Дженерики — это не шаблоны C++, совсем.
Оказывается, метод попроще всё-таки есть.
Как верно подметили в этой теме ранее, он реализуется через интерфейс, вернее через стандартный
generic-interface IEquatable<T>.
Ранее приведенный кусок кода надо дополнить всего парой строк (выделены жирным шрифтом), а именно:
using System.Collections.Generic;
namespace EqualsTest
{
interface IBase
{
void Everything();
}
class Super : IBase, System.IEquatable<Super>
{
public void Everything() { }
public bool Equals(Super other) { return true; }
}
class Container<T> : List<T> where T: IBase, System.IEquatable<T>
{
public bool Equals(Container<T> other)
{
if (Count != other.Count)
return false;
for (int i = 0; i < Count; ++i)
if (!this[i].Equals(other[i]))
return false;
return true;
}
}
class Program
{
static void Main(string[] args)
{
Container<Super> con1 = new Container<Super>();
con1.Add(new Super());
Container<Super> con2 = new Container<Super>();
con2.Add(new Super());
System.Console.WriteLine("{0}", con1.Equals(con2));
}
}
}
Всем спасибо за соучастие