Java가 C ++과 같은 개인 / 보호 된 상속을 지원하지 않는 이유는 무엇입니까? [닫은]


12

C ++에서 클래스를 상속하는 동안 사용자는 다음과 같이 액세스 지정자를 지정할 수 있습니다.

class Base
{
    public int mem1;
    protected in mem2;
};

class Derived1 : **private** Base
{
    // mem1 will be private here.
    // mem2 will be private here.
};

class Derived2 : **protected** Base
{
    // mem1 will be protected here.
    // mem2 will be protected here.
};

class Derived2 : **public** Base
{
    // mem1 will be public here.
    // mem2 will be protected here.
};

그러나 Java에서도 마찬가지입니다. 즉, Java에서 확장하는 것은 항상 C ++의 "공개"상속과 같습니다.

누군가이 이유를 설명 할 수 있습니까?


16
하나는 기능을 생략 할 이유가 필요하지 않으며 기능을 추가 할 이유 (이상적으로는 여러 가지)가 필요합니다.

1
이 답변은 투기 적으로 만 투표 할 수 있습니다.
Jimmy Hoffa

답변:


10

개인 / 보호 된 상속이 제공하는 대부분의 이점은 캡슐화를 통해 쉽게 달성 할 수 있습니다. Thomas Eding 은 개인 / 보호 상속을 추가하여 더 쉽게 만들 수있는 사례의 좋은 예를 제공했으며, 유효한 경우이지만 개인 / 보호 상속이 필요하지 않고 더 ' 아이디 오틱' 인 해결 방법이 있습니다 (Java에서 가장 작은).

Java 언어 개발자는 개인 / 보호 된 상속 (복수 상속 포함)을 지원하는 데 필요한 복잡성 비용이 제공하는 이점을 능가한다고 생각했습니다.


1
C ++에서는 개인 상속과 멤버로서의 포함 사이에 중요한 차이점이 있지만 초기화 순서와 다중 상속을 중심으로 수행되므로 더 간단한 Java 객체 시스템으로 변환되지 않습니다.
Jan Hudec

2
-1 : " 개인 / 보호 된 상속이주는 모든 이점은 캡슐화를 통해 쉽게 달성 할 수 있습니다 ." 잘못된. 나는 " 가장 큰 혜택 ..."에 동의합니다
Thomas Eding

@ThomasEding 개인 / 보호 된 상속을 통해 달성 할 수 있지만 캡슐화를 통해 달성 할 수없는 것 (또는 적어도 캡슐화로 달성하기 위해 많은 일을 해야하는 것)의 예를 들어 줄 수 있습니까? 솔직히 생각할 수는 없지만 확신 할 수 있습니다.
pswg

2
죄송합니다. 다음은 C ++의 예입니다. (1) 클래스를 내부적 으로 ( 개인적으로 상속받는 ) 클래스 B로 간주 하여 일부 메소드에서 다형성으로 사용할 수 있다고 가정하십시오 . 구성을 사용하면이 작업을 수행 할 수 있지만 훨씬 더 복잡합니다. 여기서는 사용하는 기능을 구현 하는 별도의 서브 클래스 (아마 내부 클래스) 를 작성해야 합니다. 당신은 수동으로 부모에 대한 변경 위임 할 필요가 클래스를 ( 하게 친구를, 에 대한 참조를 받아 들인다 ). 나는 이것이 너무 어렵지 않다고 생각하지만 코드에 혼란이 생깁니다. (계속)ABAA'BBA'A'B
Thomas Eding

2
... (2) B에서 보호 된 변수에 액세스 하려는 경우 A개인 상속이 구성보다 구현하기가 더 간단 해집니다. 구성을 사용하면 A'위와 유사하게 구현 하거나 보호 된 변수에 대한 액세스를 높일 수 있습니다. (3) 템플릿 인스턴스화에서 동일한 정확한 변수 인 단일 공유 정적 멤버 변수를 원한다고 가정하십시오. 해결 방법은 정적 멤버가있는 템플릿이 아닌 기본 클래스에서 비공개로 상속하는 것입니다. 컴포지션에서는이 문제를 해결할 수 없지만 다른 기술 (예 : 멤버와 다른 클래스를 친구와 사귀기)도 가능합니다.
Thomas Eding

9

Java에는 다중 상속이없고 모든 것이 (공개적으로) 상속되어야하므로 ObjectJava에 비공개 또는 보호 된 상속이 유효한 프로그램을 생성 할 수있는 곳이 없습니다.

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