is-a
Is-a![]() | 이 글에는 여러 가지 문제가 있다. 이 문제를 개선하거나 대화 페이지에서 토의하십시오. (이러한 템플릿 메시지를 제거하는 방법 및 시기 알아보기)
|
지식 표현에서 객체 지향 프로그래밍 및 설계(객체 지향 프로그램 아키텍처 참조), is-a(is_a 또는 is)는 추상화(예: 유형, 클래스) 사이의 부차적인[1] 관계인데, 여기서 한 클래스 A는 다른 클래스 B의 하위 클래스(따라서 B는 A의 슈퍼 클래스)이다. 즉 A타입은 A타입의 사양이 B타입의 사양을 내포하고 있을 때 B타입의 하위타입이다. 즉, B의 사양이 약하기 때문에 A의 사양을 만족하는 물체(또는 클래스)도 B의 사양을 만족시킨다.[2]
is-a 관계는 유형(classes) 사이의 has-a(has_a 또는 has_a) 관계와 대조되어야 한다. has-a와 is-a 관계를 혼란스럽게 하는 것은 어떤 대상과 그 하위물 사이의 실제 관계의 모델(예: 컴퓨터 프로그램)을 설계할 때 흔히 있는 오류다. is-a 관계는 객체(인스턴스)와 유형(클래스) 사이의 인스턴스(instance) 관계와도 대조될 수 있다. 자세한 내용은 유형-토큰 구별을 참조하십시오.
관계를 요약하면 다음과 같다.
- 분류학적 계층을 정의하는 유형(일반적으로) 간의 하이퍼익명-하이폰어(supertype/superclass-subtype/subclass) 관계
- 서브섬션 관계의 경우: hyponim(subtype, subclass)은 하이퍼바이닉(supertype, superclass)과 (is-a) 관계를 갖는다.
- 소유위계층을 정의하는 유형(일반적으로) 간의 균일성-익명(holonymony-monymony/party/partent/propertent/member) 관계
- 개념-유형(유형-유형) 유형과 객체(유형) 간의 관계, 다음과 같은 경우
- 토큰(개체)은 그 유형(클래스)과 관계가 있다.
하위 형식 예제
서브타이핑은 주어진 타입이 다른 타입이나 추상화를 대체할 수 있도록 한다. 서브타이핑은 언어 지원에 따라 암묵적이든 명시적이든 하위형과 일부 기존 추상화 사이의 is-a 관계를 확립한다고 한다. 상속을 지원하는 언어로 상속을 통해 그 관계를 명시적으로 표현할 수 있다.
C++
다음의 C++ 코드는 B 등급과 A 등급 사이에 명시적인 상속 관계를 설정하는데, 여기서 B 등급은 A의 하위 등급이자 하위 유형이며, B 등급이 지정되는 곳(참고를 통해 포인터 또는 객체 자체를 통해) 어디에서나 A 등급으로 사용할 수 있다.
계급 A { 공중의: 공허하게 하다 어떻게 좀 해봐.앨리케() 경시하다 {} }; 계급 B : 공중의 A { 공중의: 공허하게 하다 도썸블라이크() 경시하다 {} }; 공허하게 하다 UseAnA(A 경시하다& 일부_A) { 일부_A.어떻게 좀 해봐.앨리케(); } 공허하게 하다 썸펀치() { B b; UseAnA(b); // b는 A를 대체할 수 있다. }
파이톤
다음 파이톤 코드는 클래스 간의 명시적 상속 관계를 설정한다. B 그리고 A, where B 의 하위 클래스 및 하위 유형 A, 그리고 사용할 수 있다. A 아무데나 B 필수 사항.
계급 A: 반항하다 do_something_a_like(자아의): 통과하다 계급 B(A): 반항하다 do_something_b_like(자아의): 통과하다 반항하다 use_an_a(모종의): 모종의.do_something_a_like() 반항하다 some_funk(): b = B() use_an_a(b) # b는 A를 대신할 수 있다.
다음의 예 type(a) "일반적인" 유형이고 type(type(a)) 메타타입이야 모든 유형이 분산되어 있는 반면, 모든 유형은 동일한 메타 유형을 가지고 있다.PyType_Type, 또한 그것 자체의 메타타입), 이것은 요구 사항이 아니다. 클래식 클래스의 유형(로 알려져 있음) types.ClassType, 또한 구별되는 전유형으로 간주될 수 있다.[5]
>>> a = 0 >>> 타자를 치다(a) <타입 'int'> >>> 타자를 치다(타자를 치다(a)) <형식 '형식'> >>> 타자를 치다(타자를 치다(타자를 치다(a))) <형식 '형식'> >>> 타자를 치다(타자를 치다(타자를 치다(타자를 치다(a)))) <형식 '형식'>
자바
자바에서, 한 클래스 또는 인터페이스의 형식 매개변수와 다른 클래스 또는 인터페이스의 형식 매개변수 사이의 관계는 확장 및 구현 절에 의해 결정된다.
사용 Collections
반 ArrayList<E>
기구들 List<E>
그리고 List<E>
연장하다 Collection<E>
그래서. ArrayList<String>
의 하위 유형이다. List<String>
의 하위 유형인 , Collection<String>
. subtyping 관계는 자동으로 유지된다. 인터페이스를 정의할 때, PayloadList
일반 유형 P의 선택적 값을 각 요소와 연결하는 선언은 다음과 같이 보일 수 있다.
접점 페이로드리스트<E, P> 연장하다 리스트<E> { 공허하게 하다 setPayload(인트로 색인을 달다, P 발랄하게 하다); ... }
PayloadList의 다음과 같은 매개 변수는 다음과 같다. List<String>
:
페이로드리스트<끈, 끈> 페이로드리스트<끈, 정수> 페이로드리스트<끈, 예외>
리스크소프 대체 원리
리스크노프 대체원리는 "S타입의 각 개체 o1에 대해 T타입의 개체 o2가 존재한다면, o1이 o2로 대체될 때 P의 동작은 변하지 않고, S는 T타입의 하위타입"이라는 속성을 설명한다.[6] 다음의 예는 LSP 위반을 보여준다.
공허하게 하다 드로 셰이프(경시하다 모양& s) { 만일 (활자의(s) == 활자의(사각형)) 그리기제곱(정적_캐스트<사각형&>(s)); 다른 만일 (활자의(s) == 활자의(원)) 드로크서클(정적_캐스트<원&>(s)); }
분명히 DrawShape 함수의 형식이 잘못되어 있다. Shape 클래스의 모든 파생 클래스에 대해 알아야 한다. 또한 Shape의 하위 클래스가 새로 생성될 때마다 변경해야 한다. 객체지향적 설계에서 많은[who?] 사람들은 이것의 구조를 아나테마로 본다.
LSP 위반의 보다 미묘한 예는 다음과 같다.
계급 직사각형 { 공중의: 공허하게 하다 설정폭(곱절로 하다 w) { 그것의 폭 = w; } 공허하게 하다 세트하이이트(곱절로 하다 h) { 높이 = h; } 곱절로 하다 겟하이이트() 경시하다 { 돌아오다 높이; } 곱절로 하다 GetWidth() 경시하다 { 돌아오다 그것의 폭; } 사유의: 곱절로 하다 그것의 폭; 곱절로 하다 높이; };
이는 잘 작동하지만, Rectangle 클래스를 이어받는 Square 클래스에 대해서는 Rectangle과 Square의 관계가 유지됨에도 불구하고 LSP를 위반한다. 왜냐하면 사각형은 직사각형이기 때문이다. 다음 예제는 Setwidth와 SetHeight라는 두 가지 기능을 재정의하여 문제를 해결한다. 그러나 코드를 고정하는 것은 설계가 잘못되었다는 것을 의미한다.
공중의 계급 사각형 : 직사각형 { 공중의: 가상의 공허하게 하다 설정폭(곱절로 하다 w); 가상의 공허하게 하다 세트하이이트(곱절로 하다 h); }; 공허하게 하다 정사각형::설정폭(곱절로 하다 w) { 직사각형::설정폭(w); 직사각형::세트하이이트(w); } 공허하게 하다 정사각형::세트하이이트(곱절로 하다 h) { 직사각형::세트하이이트(h); 직사각형::설정폭(h); }
다음 예시, 함수 g는 사각형 클래스에만 사용되지만 사각형 클래스에 대해서는 작동하지 않기 때문에 오픈 클로즈드 원칙을 위반했다.
공허하게 하다 g(직사각형& r) { r.설정폭(5); r.세트하이이트(4); 주장하다(r.GetWidth() * r.겟하이이트()) == 20); }
참고 항목
메모들
- ^ 리스크노프 대체 원칙을 참조하십시오.
- ^ "Subtypes and Subclasses" (PDF). MIT OCW. Retrieved 2 October 2012.
- ^ 격납(컴퓨터 프로그래밍)을 참조하십시오.
- ^ Mitchell, John (2002). "10 "Concepts in object-oriented languages"". Concepts in programming language. Cambridge, UK: Cambridge University Press. p. 287. ISBN 0-521-78098-5.
- ^ Guido van Rossum. "Subtyping Built-in Types". Retrieved 2 October 2012.
- ^ Liskov, Barbara (May 1988). Data Abstraction and Hierarchy (PDF). SIGPLAN Notices.
- ^ "The Liskov Substitution Principle" (PDF). Robert C. Martin, 1996. Archived from the original (PDF) on 5 September 2015. Retrieved 2 October 2012.
참조
- Ronald J. Brachman; IS-A가 무엇이고 무엇이 아니다. 시맨틱 네트워크에서의 택사노믹 링크에 관한 연구 IEEE 컴퓨터, 16 (10); 1983년 10월
- 장 뤼크 하이노트, 장 마르크 힉, 빈센트 엥글버트, 장 헨라드, 디디에 롤랜드: IS-A 관계의 구현 이해. ER 1996: 42-57