"사각이 사각형에서 상 속됨"역설에 대한 특정 이름이 있습니까?


18

OOP의 특정 실패는 Rectangle에서 상속되는 Square 클래스와 함께 표시됩니다. 여기서 논리적으로 Square는 Rectangle의 특수화이므로 Rectangle에서 상속해야하지만 Square의 길이나 너비를 변경하려고하면 모든 것이 분리됩니다.

그 사건에 무슨 문제가 있는지 설명하는 구체적인 용어가 있습니까?


2
정확히 무엇이 잘못되었는지 설명해 주시겠습니까? 무슨 말인지 이해가 안 돼요
gnat

1
사각형에 길이와 너비를 전달하여 크기를 설정할 수있는 가상 방법이 있다고 가정하면 사각형에 다른 길이와 너비를 설정하면 사각형이 반환되고 사각형에 동일한 길이와 너비를 설정하면 사각형이 반환됩니다. 사각형을 명시 적으로 알아야하는 모든 코드는 사각형으로 캐스트를 시도 할 수 있습니다. 오류가 발생하는 방법을

8
이것은 역설이 아닙니다. 이것은 문제 도메인의 부적절한 모델링의 경우입니다. 상속 계층 구조가 반드시 문제 영역의 계층 구조와 일치하지는 않습니다. 좋은 모델이지만, 실제 모델과 다른 방식으로 작업해야하는 부분을 이해하는 것이 좋습니다.
Michael Kohne

1
FWIW :보다 구체적으로, 문제는 읽기 및 쓰기 인터페이스가 일치하지 않는다는 것입니다. 즉, 원을 타원의 특수화로 읽을 수 있지만 타원은 원의 특수화로만 쓸 수 있습니다.
Macke

1
@GrandmasterB 저는 "명확히 모순되는 성격을 보이는 사람, 사물 또는 상황"으로갑니다. 정사각형에 다른 속성이있는 경우, 정사각형이 Rectangle의 하위 유형이 될 것으로 예상 할 때 "정사각형은 사각형의 일종이 아닙니다"라고 말해야합니다. 실제 응용 프로그램에 Rectangle 및 Square 유형이 없을 수도 있습니다. 클래스 기반 패러다임에 나타날 수있는 특정 종류의 문제를 설명하기위한 추상화 일뿐입니다.
Victor

답변:


27

Wikipedia는 단순히 그것을 원 타원 문제 라고 말합니다.

원 - 타원 문제 (때로는라는 소프트웨어 개발에 사각형 직사각형 문제 ) 객체 모델링에서 서브 타입 다형성을 사용할 때 발생할 수있는 함정의 숫자를 보여줍니다. 이 문제는 객체 지향 프로그래밍을 사용할 때 가장 일반적으로 발생합니다.

이것은 약어 SOLID 의 L로 Liskov 대체 원리 로 알려져 있습니다. 이 문제는 해당 원칙을 위반하여 발생합니다.

문제는 원과 타원을 나타내는 클래스 (또는 유사하게 사각형과 사각형) 사이에 어떤 하위 유형 또는 상속 관계가 있어야하는지에 관한 것입니다. 더 일반적으로, 문제는 기본 클래스에 파생 클래스에서 발견 된 (더 강한) 불변을 무효화하여 Liskov 대체 원칙을 위반하는 방식으로 객체를 변경하는 메소드를 포함 할 때 발생할 수있는 어려움을 보여줍니다.


1
그리고 그것을 읽으면서, Wikipedia는 "Liskov 대체 원리의 위반"이라고 더 학문적 인 설명을 언급합니다. 고마워 :)
빅터

1
글쎄, 그것은 당신이 그것을 어떻게 보는가에 따라 위반입니다. 개인적으로 모든 원은 타원입니다. 위반이 없습니다. 타원 방법이 제한적이되면 위반이 시작됩니다. 그런 다음 해당 특정 시나리오에서 원은 해당 타원 계약의 하위 유형이 될 수 없습니다.
마크 Canlas

6
@MarkCanlas이 문제는 틀림없이 Liskov 대체 원칙을 위반 한 것입니다. 다른 원칙을 위반하지는 않았지만 아무도 주장하지 않았습니다. 계약에 손상이 발생하지 않은 불 변형이 포함되어 있지 않기 때문에 문제가 발생하지 않는 경우 (유효한 모델을 상상할 수는 없지만) LSP를 위반하지 않았을 수도 있지만 문제 가 발생했을 때 LSP 위반이 아닙니다.

7
@Mark Canlas : 아니요, 상수 원은 일정한 타원이고, 가변 원은 가변 타원이 아닙니다. 기하 상수 성으로 가정하면 타원을 변경할 수 없으며 다른 타원을 취할 수 있습니다
maxim1000

1
Liskov 대체 원칙의 History Constraint / Rule은 하위 유형이 새로운 메소드를 추가 할 때 해당 메소드가 오브젝트가 아닌 히스토리 (즉, 일련의 상태)를 작성하는 방식으로 오브젝트의 상태를 조작 할 수 없다고 말합니다. 수퍼 타입에 허용됩니다. 예를 들어, 수퍼 타입의 메소드를 통해서만 조작하면 상태가 항상 동일하지만 서브 타입의 뮤 테이터 메소드를 통해 조작하면 상태가 변경되기 때문에 불변의 서브 타입을 변경할 수 없습니다. 그것은 슈퍼 타입에 의해 허용되지 않는 역사입니다.
Jörg W Mittag


8

Liskov 대체 원칙보다 더 근본적인 수준에서 이는 범주 오류 또는 범주 실수입니다.

모델링 동작맥락 에서 사각형은 단순히 사각형의 유형이 아닙니다.

이것을 인식하면 초기 가정 (사각형은 사각형의 한 유형)이 재생에서 제거되므로 문제가 증발합니다.

이 답변의 문제는 학교 이후에 사각형이 사각형 유형이라는 기하학을 수행하는 모든 사람에게 드릴된다는 것입니다. 그러나 이것은 매우 구체적인 상황 (내부 각도의 특성에 따라 기하학적 모양의 분류) 내에서만 사실이라는 것을 이해하는 것이 중요합니다. 동작 측면에서 사각형은 사각형이 아닙니다. 잘못된 컨텍스트에서 분류 세트를 보는 것은 카테고리 실수입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.