is-a

Is-a

지식 표현에서 객체 지향 프로그래밍설계(객체 지향 프로그램 아키텍처 참조), is-a(is_a 또는 is)는 추상화(예: 유형, 클래스) 사이의 부차적[1] 관계인데, 여기서 한 클래스 A는 다른 클래스 B의 하위 클래스(따라서 BA의 슈퍼 클래스)이다. 즉 A타입은 A타입의 사양이 B타입의 사양을 내포하고 있을 때 B타입의 하위타입이다. 즉, B의 사양이 약하기 때문에 A의 사양을 만족하는 물체(또는 클래스)도 B의 사양을 만족시킨다.[2]

is-a 관계는 유형(classes) 사이의 has-a(has_a 또는 has_a) 관계와 대조되어야 한다. has-ais-a 관계를 혼란스럽게 하는 것은 어떤 대상과 그 하위물 사이의 실제 관계의 모델(예: 컴퓨터 프로그램)을 설계할 때 흔히 있는 오류다. is-a 관계는 객체(인스턴스)와 유형(클래스) 사이의 인스턴스(instance) 관계와도 대조될 수 있다. 자세한 내용은 유형-토큰 구별을 참조하십시오.

관계를 요약하면 다음과 같다.

  • 분류학적 계층을 정의하는 유형(일반적으로) 하이퍼익명-하이폰어(supertype/superclass-subtype/subclass) 관계
    • 서브섬션 관계의 경우: hyponim(subtype, subclass)은 하이퍼바이닉(supertype, superclass)과 (is-a) 관계를 갖는다.
  • 소유위계층을 정의하는 유형(일반적으로) 간의 균일성-익명(holonymony-monymony/party/partent/propertent/member) 관계
    • 통합(즉, 소유권이 없는) 관계의 경우:
      • 호칭(호칭)은 그 호칭(부분)과 관계가 있다.
    • 구성(예: 소유권 포함) 관계의 경우:
      • 성(性)은 그 성(性)과 일부 관계가 있다.
    • 격납[3] 관계의 경우:
      • 명사(명사)가 그 명의(명사)와 회원 관계를 맺고 있는 경우
  • 개념-유형(유형-유형) 유형과 객체(유형) 간의 관계, 다음과 같은 경우
    • 토큰(개체)은 그 유형(클래스)과 관계가 있다.

하위 형식 예제

서브타이핑은 주어진 타입이 다른 타입이나 추상화를 대체할 수 있도록 한다. 서브타이핑은 언어 지원에 따라 암묵적이든 명시적이든 하위형과 일부 기존 추상화 사이의 is-a 관계를 확립한다고 한다. 상속을 지원하는 언어로 상속을 통해 그 관계를 명시적으로 표현할 수 있다.

C++

다음의 C++ 코드는 B 등급A 등급 사이에 명시적인 상속 관계를 설정하는데, 여기서 B 등급은 A의 하위 등급이자 하위 유형이며, B 등급이 지정되는 곳(참고를 통해 포인터 또는 객체 자체를 통해) 어디에서나 A 등급으로 사용할 수 있다.

계급 A { 공중의:    공허하게 하다 어떻게 좀 해봐.앨리케() 경시하다 {} };  계급 B : 공중의 A { 공중의:    공허하게 하다 도썸블라이크() 경시하다 {} };  공허하게 하다 UseAnA(A 경시하다& 일부_A) {    일부_A.어떻게 좀 해봐.앨리케(); }  공허하게 하다 썸펀치() {    B b;    UseAnA(b); // b는 A를 대체할 수 있다. } 

[4]

파이톤

다음 파이톤 코드는 클래스 간의 명시적 상속 관계를 설정한다. 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)))) <형식 '형식'> 

자바

자바에서, 한 클래스 또는 인터페이스의 형식 매개변수와 다른 클래스 또는 인터페이스의 형식 매개변수 사이의 관계는 확장 및 구현 절에 의해 결정된다.

사용 CollectionsArrayList<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); } 

[7]

참고 항목

메모들

  1. ^ 리스크노프 대체 원칙을 참조하십시오.
  2. ^ "Subtypes and Subclasses" (PDF). MIT OCW. Retrieved 2 October 2012.
  3. ^ 격납(컴퓨터 프로그래밍)을 참조하십시오.
  4. ^ 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.
  5. ^ Guido van Rossum. "Subtyping Built-in Types". Retrieved 2 October 2012.
  6. ^ Liskov, Barbara (May 1988). Data Abstraction and Hierarchy (PDF). SIGPLAN Notices.
  7. ^ "The Liskov Substitution Principle" (PDF). Robert C. Martin, 1996. Archived from the original (PDF) on 5 September 2015. Retrieved 2 October 2012.

참조