프로그래밍 언어 관점에서 서브 타이핑이란 무엇입니까? "상속은 하위 유형이 아닙니다"라고 들었습니다. 그렇다면 상속과 하위 유형의 차이점은 무엇입니까?
프로그래밍 언어 관점에서 서브 타이핑이란 무엇입니까? "상속은 하위 유형이 아닙니다"라고 들었습니다. 그렇다면 상속과 하위 유형의 차이점은 무엇입니까?
답변:
[객체 지향 유형 시스템의 문제에 대해 깊이 생각하지는 않았지만 토론을 진행하기 위해 알고있는 것을 말할 것입니다.]
우리는 말할 의 하위 유형 인 B 모든 경우 A는 값이 모든 상황에서 사용할 수있는 -typed B는 값이 예상되는 -typed. 아니면 다른 방법으로달리 말하면 A 유형 값은 B 유형 값으로 "가장 무도회"할 수 있습니다.
이러한 마스커레이딩이 유형 검사에 문제가없는 경우, 즉 유형의 값을 연결 하는 경우 유형의 값이 필요한계속 입력하면 유형 점검이 계속 진행되는 경우이를"구조적서브 타이핑"이라고합니다. 동작에 문제가 발생하지 않는 경우 (예 : 이러한 막힘으로 인해 예상되는 동작이 변경되지 않는 경우)"행동 적 하위 유형 지정"이라고합니다. ( "예상되는 행동"은 별도로 공식화되어야하며 많은 행동 개념이 가능합니다.)
구조적 서브 타이핑은 유형의 구조가 우연한 이유로 일치 할 수 있으므로 동작 서브 타이핑을 보장하지 않습니다. 그러나 예상되는 동작을 정의하는 것은 쉽지 않습니다. 따라서 많은 프로그래밍 언어가 중간 지점을 사용하므로 사용자는 어느 유형이 하위 유형인지 선언해야합니다. 이것을 "공칭 서브 타이핑"이라고 합니다. 암시 적 대 명시 적 하위 유형 에 대한 질문을 참조하십시오.이 문제에 대한 토론. 아이디어는 프로그래머가 자신의 독창성을 사용하여 선언 된 모든 하위 유형에 대한 행동 하위 유형을 보장해야한다는 것입니다. 언어는 도움을 줄 수 없습니다. 그러나 선언 된 모든 하위 유형은 최소한 구조적 하위 유형이어야합니다. 그렇지 않으면 프로그램이 검사를 입력하지 못했습니다. 언어가이를 보장 할 수 있습니다. (일부 프로그래밍 언어는 컴파일 타임에이를 보장하기에 충분한 유형 시스템을 가지고 있지 않습니다. 그러한 경우 런타임에 유형 오류가 감지되거나 잘못된 결과가 생성 될 수 있습니다. 이러한 유형 구멍은 분명히 바람직하지 않습니다.)
객체 지향 프로그램에서 서브 클래스를 정의 할 때 일반적으로 공개적으로 보이는 필드 (또는 메소드)를 추가합니다. 대부분의 프로그래밍 언어에서 이러한 서브 클래스는 공칭 으로 간주됩니다 하위 유형 . 문제는 그것들이 또한 구조적 서브 타입 인지의 여부 입니다. 만약 그것이 프로그래밍 언어가 아닌 경우, 즉 구조적 서브 타입이 아닌 명목 서브 타입을 선언 할 수 있다면, 프로그래밍 언어에 타입 홀이있을 것입니다.
간단한 경우에는 필드를 추가해도됩니다. 수퍼 클래스의 유형은 서브 클래스의 유형보다 적은 수의 필드를 예상합니다. 따라서 sueprclass의 인스턴스가 예상되는 서브 클래스의 인스턴스를 연결하면 프로그램은 제공된 추가 필드를 무시하고 아무런 문제가 없습니다.
그러나 수퍼 클래스 또는 서브 클래스에 자체와 동일한 유형의 인수를 사용하거나 자체와 동일한 유형의 결과를 리턴하는 메소드가있는 경우 문제점이 발생합니다. 그러면 서브 클래스의 인터페이스 유형은 수퍼 클래스 의 인터페이스 유형이 아닙니다 . Java와 같이 널리 사용되는 형식 안전 프로그래밍 언어는 이러한 하위 클래스를 허용하지 않습니다. 따라서 언어를 제한 하여 형식 안전성을 얻습니다. 프로그래밍 언어 인 Eiffel은 유연성 을 얻기 위해 타입 안전성을 희생했다고합니다 . 융통성을 유지하는 강력한 유형 시스템을 설계하는 경우 하위 클래스가 하위 유형을 생성한다는 원칙을 포기해야합니다. 따라서 논문의 제목은 "상속은 아 종형이 아니다". 저자는 대신 작동하는 고차 하위 유형의 다른 개념을 제안합니다. Kim Bruce는 또한 동일한 효과를 달성하는 "매칭"이라는 밀접한 관련 제안을 가지고 있습니다. 이 프리젠 테이션을 참조하십시오 . Andrew Black 의 게재 논문 도 도움이 됩니다.
시맨틱 커뮤니티는 아마도 문제를 크게 무시하는 데 잘못되었을 수 있습니다. 우리는 전통적으로 그것을 이론적 인 관심이 거의없는 실용적인 유형 시스템 엔지니어링 문제로 간주했습니다. 그렇지 않은 경우 실제로 해당 지역에서 일부 의미론 작업이있는 경우 다른 사람들이 언급 할 수 있기를 바랍니다.