Предположим, вы пишете исходный класс С# Object
, и вам нужны следующие функции:
-
object1 == object2
будет сравнивать ссылки, если этот оператор не переопределен. -
object1 != object2
всегда будет возвращать обратный объекту ACTUALobject1 == 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, а не к фактическому производному классу.
Есть ли способ, которым это может работать без изменения самого С#? Мне все равно, что это возможно на С#, но мне все равно, есть ли какой-то принцип ООП, который говорит мне, что я не должен ожидать, что это будет работать.
Кроме того, я не уверен, является ли это основополагающим для этого вопроса, но идея заключается в том, чтобы NotEquals был виртуальным, так что он тоже может быть переопределен производными классами, которые хотят, чтобы их o1 != o2
отличались друг от друга от !(o1 == o2)
. Этот вопрос вдохновлен этим недавним обсуждением.