То, как лучше всего реализовать, Равняется для пользовательских типов?

Вы можете создать способ определения статических констант в классе с использованием нечетной функции классов ES6. Поскольку statics наследуются по своим подклассам, вы можете сделать следующее:

const withConsts = (map, BaseClass = Object) => {
  class ConstClass extends BaseClass { }
  Object.keys(map).forEach(key => {
    Object.defineProperty(ConstClass, key, {
      value: map[key],
      writable : false,
      enumerable : true,
      configurable : false
    });
  });
  return ConstClass;
};

class MyClass extends withConsts({ MY_CONST: 'this is defined' }) {
  foo() {
    console.log(MyClass.MY_CONST);
  }
}
34
задан Joan Venge 19 February 2009 в 22:59
поделиться

5 ответов

Существует полный набор инструкции по MSDN также. Необходимо считать их хорошо, это и хитро и важно.

Несколько точек я нашел самым полезным:

  • Типы Значения не имеют Идентификационных данных, таким образом, в struct Point Вы будете обычно делать, участник участником выдерживает сравнение.

  • Ссылочные типы обычно имеют идентификационные данные, и поэтому Равняется тесту, обычно останавливается в ReferenceEquals (значение по умолчанию, никакая потребность переопределить). Но существуют исключения, как строка и Ваш class Point2 , где объект не имеет никаких полезных идентификационных данных, и затем Вы переопределяете участников Равенства для обеспечения собственной семантики. В той ситуации следуйте инструкциям для прохода через пустой указатель и случаи другого-типа сначала.

  • И существуют серьезные основания сохранить GethashCode() и operator== в синхронизации также.

27
ответ дан Henk Holterman 10 October 2019 в 14:09
поделиться

В том, который берет obj, если тип obj является Point2, звонят, конкретный тип Равняется. В конкретном типе Равняется, удостоверьтесь, что у всех участников есть то же значение.

public override bool Equals ( object obj )
{
   return Equals(obj as Point2);
}

public bool Equals ( Point2 obj )
{
   return obj != null && obj.X == this.X && obj.Y == this.Y ... 
   // Or whatever you think qualifies as the objects being equal.
}

, вероятно, необходимо переопределить GetHashCode также, чтобы удостовериться, что возражает, что "равны", имеют тот же хэш-код.

35
ответ дан Daniel LeCheminant 10 October 2019 в 14:09
поделиться
  • Определяют то, что означают идентификационные данные.. если ссылочные идентификационные данные затем наследованное значение по умолчанию будет равняться, то будет работать.
  • , Если тип значения (и таким образом оценивают идентификационные данные) необходимо определить.
  • , Если тип класса, но имеет семантику значения затем, определяют.

Вероятный Вы хотите к и , переопределение Равняется (возражают) и определяют, Равняется (MyType), потому что последний старается не упаковывать. И переопределите оператор равенства.

книга Инструкций по Платформе.NET (2-й редактор) имеет больше покрытия.

2
ответ дан Richard 10 October 2019 в 14:09
поделиться

Lie Daniel L сказал,

public override bool Equals(object obj) {
    Point2 point = obj as Point2; // Point2? if Point2 is a struct
    return point != null && this.Equals(point);
}

public bool Equals(Point2 point) {
    ...
}
0
ответ дан configurator 10 October 2019 в 14:09
поделиться
public override bool Equals ( object obj )
{
   // struct
   return obj  is Point2 && Equals (  ( Point2 ) value );
   // class
   //return Equals ( obj as Point2 );
}

public bool Equals ( Point2 obj )
0
ответ дан baretta 10 October 2019 в 14:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: