Скажем, вы писали оригинальный класс C # Object
и хотели получить следующую функциональность:
object1 == object2
будет сравнивать ссылки, если этот оператор не переопределен
object1 != object2
всегда возвращает значение, обратное действительному для объекта object1 == object2
Так, например, если у меня есть класс Bunny
(производный от Object
), который использует длину уха в качестве метода equals, то метод notequals (унаследованный от Object
) должен вернуть true, если кролики имеют разной длины ушей.
Проблема, которую я вижу, заключается в том, что если я напишу свой класс Object
что-то вроде:
public partial class Object {
public virtual bool Equals(Object o2) {
return (this === o2);
}
public bool NotEquals(Object o2) {
return !this.Equals(o2);
}
}
тогда кажется, что это определение свяжет NotEquals с Object
Equals, а не с фактическими производными классами.
Есть ли способ, которым это может работать без какого-либо изменения самого C #? Мне все равно, что это возможно в C #, но меня волнует, есть ли какой-то принцип ООП, который говорит мне, что я не должен ожидать, что подобные вещи будут работать.
Кроме того, я не уверен, является ли это основополагающим для вопроса, но идея заключается в том, чтобы NotEquals также был виртуальным, чтобы его можно было переопределить производными классами, которые хотят, чтобы их o1 != o2
были другими от !(o1 == o2)
. Этот вопрос вдохновлен этим недавним обсуждением .