Re[7]: Вызов "неизвестного" метода Equals из шаблона
От: KA it-knowledge-base.blogspot.com
Дата: 05.01.11 17:15
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

KA>>Поэтому путь через переопределение стандартного метода Equals и GetHashCode — это слишком громоздко.

KA>>Есть ли способ попроще?

JR>Есть, но о нём Вам уже говорили — class Container<T> : List<T> where T: Super. Либо интерфейс. Дженерики — это не шаблоны C++, совсем.


Оказывается, метод попроще всё-таки есть.
Как верно подметили в этой теме ранее, он реализуется через интерфейс, вернее через стандартный generic-interface IEquatable&lt;T&gt;.
Ранее приведенный кусок кода надо дополнить всего парой строк (выделены жирным шрифтом), а именно:
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));
    }
  }
}


Всем спасибо за соучастие
//
#import <windows.bas>
class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.