2013-01-17 6 views
2

Java, .NET 패밀리, Python, Ruby와 같은 많은 객체 지향 언어에서 다른 모든 클래스가 상속하는 루트 객체 클래스는 동등한 검사 메소드를 정의합니다. 그러나 내 경험에 비추어 볼 때, 내가 만드는 클래스 중 상당수는 평등 체크가 필요하지 않으며, 우리 (또는 동료)는 기본 메소드를 재정의하는 것을 신경 쓰지 않는다. 왜냐하면 우리가 사용하려고하지 않기 때문이다. 후자의 경우, 기본 동등성 메소드는 해당 클래스에 대해 동등 함을 잘 나타내지 않습니다. 그렇다면 왜 많은 언어가이 클래스를 루트 객체 클래스의 정의의 일부로 제공합니까? 많은 클래스가 그렇게해서는 안되는 것처럼 보입니까? 평등 방법을 중단하고 사용자가 필요할 때 정의하도록 강요하십시오. 물체를 들어루트 객체가 평등을 구현하는 이유는 무엇입니까?

+0

누군가가 downvote를 설명하면 감사하겠습니다. 이 질문이 주제를 벗어나거나 허용되지 않는 경우 제거하겠습니다. – jpmc26

답변

1

XY 참조, 유형에 관계없이, 그것은 의미있는 질문하고 질문에 대답 할 수있다 "는 한 Y에 의해 참조에 해당하는 X가 참조하는 객체입니다". X이 Porche 911 자동차를 나타내고 Y이 주철 공원 벤치를 나타내는 경우 대답은 단순히 "아니오"입니다. 확실히 X이 자동차이고 Y 벤치 인 것을 알았 으면 한 사람은 묻는 것이 싫지만 X, Y 또는 둘 다 "페인트 칠해야 할 것"이라고 가정합니다. XY이 같은 유형인지 여부를 알 수 없으며 객체가 같지 않아 상관이 없습니다. 등가성을 요구하는 보편적 인 수단을 가짐으로써 코드는 객체의 정확한 유형에 대해 걱정할 필요가 없게됩니다.

모든 개체가 가상 메서드로 구현되는 이유는 개체가 참조 평등보다 더 넓은 동등한 정의를 제공 할 수있는 가장 쉬운 메커니즘입니다. 불변 객체가 동일한 불변 상태를 갖는 다른 객체와 동등하다고보고하는 것은 종종 유용합니다 (예. 두 문자열 모두 "GEORGE"여섯 개의 문자를 포함하여 서로를보고 함) 모든 개체가 가상 메서드로 구현되고 변경 가능한 개체의 구현이 단순히 참조 평등을보고하는 경우 일반적으로 Equals 함수를 사용하는 것보다 쉽습니다. 변경 불가능한 객체에만 사용됩니다. 결국, 변경 가능한 객체가 단순히 그 자체가 아닌 다른 것으로 불평등하다고 스스로를보고하는 것이 어렵지 않습니다.

+0

이것은 공정한 지적입니다. 그러나 정상적인 객체 지향 방식을 사용하여이 문제를 처리 할 수 ​​있습니다. 정적으로 입력 된 언어에서는 인터페이스를 구현할 수 있습니다. 예를 들어, 'Paintable'또는 'IPaintable'일 수도 있고, 언어 관습에 따라 달라질 수도 있습니다.이 인터페이스는 아마도 equals 메소드 ('Equatable' 또는'IEquatable')를 정의하는 인터페이스를 확장 할 것입니다. 동적 인 언어에서, 오리 (duck) 타이핑 규칙은 equals 메소드를 정의하지 않으면 equals를 호출하여 불어 넣도록 지시합니다. 내가 놓친 게 있니? – jpmc26

+0

내가 놓친 것 중 하나는 모든 객체가 동등성 테스트를 구현할 것을 요구하지 않는다면 모든 인터페이스 'IFoo'는 (1) 모든 구현이 동등성 테스트를 제공하도록 요구하거나 (2) 두 개의 'IFoo' 참조의 동등성을 테스트하고자하는 코드는 다른 것으로 캐스트되어야합니다. IFoo' *를 구현 한 모든 클래스 객체가 동등성 테스트를 구현할 수 있다는 것을 감안할 때 옵션 # 1은 # 2보다 낫지 만 모든 인터페이스가 동등성 테스트를 요구한다면, 누구든 개는 총알을 물고 그것을 보편적으로 만들 수 있습니다. – supercat

+0

@ jpmc26 : 위 참조. 또한 성능 관점에서 프레임 워크가 임의의 참조를 참조 평등에 대해 테스트 할 수 있도록 허용하는 이유는 알지만 순수 OOP 관점에서 볼 때 참조가 null인지 여부 만 확인할 수있는 유일한 테스트라고 가정합니다. 코드는 일반적으로 두 개의 'String'참조가 같은 인스턴스를 가리키는 지 알지도 신경 쓰지 않아야합니다.두 객체가 * 동등한지를 아는 것은 코드가 알기를 원하는 합법적 인 것이지만 동등성이 참조 평등을 의미하는지 여부는 (성능을 제외하고는) 그렇지 않습니다. – supercat

관련 문제