2011-09-21 4 views
0

어리석은 것처럼 들릴지 모르지만 모든 클래스가 암시 적으로 Object 클래스를 확장하고 하나 이상의 클래스를 확장 할 수 있다면 다중 상속이 아닌 방법은 무엇입니까? 사용자의 관점에서 볼 때 사용자가 둘 이상의 클래스를 확장 할 수 없기 때문에 다중 상속을 지원하지 않는다고 주장 할 수 있습니다. 그러나 언어에는 다중 상속에 대한 내부 지원이있는 것처럼 보입니다. 다중 상속은 사용자에게 단순하지 않게 노출 될 수 있습니다. 나는 이해가 되니?루비, 자바 등의 다중 상속

참고 : 다중 상속에 대한지지를지지하고 있습니다. 그냥 몇 가지 생각을 분명히하려고 노력하십시오.

+5

아무튼하는 클래스 (상속 체인은 루비 버전에 따라 다릅니다) Object 이외에 "하나 이상의 클래스"를 확장하지 않습니다. 상위를 지정하지 않으면 기본 상위는 Object입니다. –

+1

귀하의 의견은 목표에 바로 지금은 정말 바보 같은 느낌. 그러나 이것은 처음이나 마지막이되지 않습니다. 따라서 모든 클래스는 암시 적으로 Object를 확장하지 않으며 대신 부모가 지정되지 않은 경우에만 확장됩니다. 그러나 모든 클래스는 Object의 속성에 액세스 할 수 있습니다. 그 이유는 계층 구조의 한 가지 또는 다른 것이 루트로 Object를 포함하기 때문입니다. 따라서 이러한 언어에는 다중 상속에 대한 내부 또는 외부 지원이 없습니다. 말이된다. 감사. –

답변

7

일반적인 OO 시스템은 임의의 길이의 체인 체인을 지원합니다. 어느 하위 클래스의 관점에서 보면 부모는 Object에 체인을 다시 형성합니다. 한 번에 모든 클래스를 살펴보면, 클래스 계층 구조가 실제로는 트리 아래에 있으며, 바로 아래에 매우 넓은 팬 아웃이 있음을 알 수 있습니다.

무엇

하지 나무에 두 가지가 특히 직접 여러 슈퍼 클래스를 가지고 있으며, 클래스에 다시 병합 할 수있다 전형적인 것 "다중 상속"수단이다.

영어 의미에서 "여러"가능성은 있지만, 궁극적으로 하나의 객체를 다중 인터페이스로 전달할 수 있다는 의미에서 "다중"은 아닙니다. 부모 클래스.

이 제한 사항을 해결하는 방법은 일반적인 것이기 때문에 Java에서 인터페이스를 사용하고 Ruby에 포함 된 ("mixin") 모듈을 사용해야합니다.

+1

이제 내가 어떻게 생각을 시작할 필요가있다 : – secreteyes

+1

+1, 잘되었다. 하나의 사소한 점 : "정말 나무입니다."는 클래스 모델에서 클래스 계층 구조로의 기이 한 전환이며, 앞 문장은 이전 문장과는 다른 의미로 빠져 있습니다. –

+0

+1. Java와 Ruby가하고있는 합성을 통해 다중 상속의 목표를 달성 할 수 있습니다. 내 질문은 언어가 다중 상속을 지원하지만 사용자에게 노출되지 않는 경우에 관한 것입니다. 데이비드 Nehme의 의견은 내 사고 과정의 결함을 파악하는 데 도움이되었습니다. –

1

"true"다중 상속을 사용하면 다른 클래스 트리의 차이 클래스에서 상속 할 수 있습니다. 자식 클래스가 상속받은 두 클래스가 비슷한 속성이나 메서드를 가지고 있고 자식의 충돌을 처리해야하는 경우 문제가 발생합니다.

다중 상속이 허용되지 않는 Java와 같은 언어에서 동일한 멤버는 하위 클래스의 멤버에 의해 간단히 재정의됩니다.

결론적으로 유형 계층 구조에 많은 클래스가있을 수 있지만 하나의 버전 만 각 구성원이 부모 구성원을 자신의 것으로 대체합니다.

0

Java의 모든 참조 유형은 앞서 언급 한 것처럼 java.lang.Object입니다.

사용자 지정 형식을 정의하는 개발자는 하나의 구현을 사용하여 확장 할 수 있습니다. 여러 개의 인터페이스를 구현하도록 선택할 수 있지만 구현과 함께 제공되지는 않습니다. 개발자는 자신의 것을 추가해야합니다.

Java의 사용자 정의 유형이 java.lang.Object 및 확장 된 수퍼 클래스 모두에서 구현을 수신한다고 말하면 정확하지만 개발자가 하나의 구현 클래스 만 확장 할 수 있기 때문에 구현의 단일 상속으로 간주됩니다.

의미론을 주장하고 있습니다. Java에서 여러 구현을 확장 할 수 없습니다.

하지만 여러 인터페이스를 구현합니다.

2

당신이 묘사 한 상황은 순수한 상속 일 뿐이며, 다중 상속과 공통점이 없습니다. 예를 들어 Java에서는 IntegerNumber을 상속하고 NumberObject에서 상속됩니다. 다중 상속과 언어의

표준 예를 들어 자바에서 우리가

다중 상속 루비의 측면에서
class A { } 
class B extends A { } 
class C extends B { } 
class X extends C { } 

자바와 유사하다있는 반면 C++

class A { }; 
class B { }; 
class C { }; 
class X : public A, private B, public C { }; 

입니다 (루비의 클래스는 하나를 가질 수 있습니다 선조). 그러나 루비는 다른 메커니즘을 제공하는 다수의 "역할"상속 즉, 모듈

클래스 AA이 기본 조상을 가지고 (유사 자바) 루비에서
# class XX inherits from CC 
class AA 
end 
class BB < AA 
end 
class CC < BB 
end 
class XX < CC 
end 

# class X mixin A,B,C modules 
module A end 
module B end 
module C end 
class X 
    include A 
    include B 
    include C 
end 

X.ancestors 
[X, C, B, A, Object, Kernel, BasicObject] 
XX.ancestors 
[XX, CC, BB, AA, Object, Kernel, BasicObject] 
+0

나는 명확한 예를 들어 답을하고 +1을 좋아한다. 그러나 당신이 "당신이 묘사 한 상황은 순수한 상속 일뿐입니다. 다중 상속과 공통점이 없습니다." Java 및 Ruby에서 조상의 각 계층은 하나의 클래스가 될 수 있습니다. 이는 정규 상속입니다. 나는 항상 여러 상속이 하나 이상의 클래스에서 동시에 상속받을 수있는 능력을 의미한다고 생각했다. 우리 중 한 명이이 용어에 대해 혼란 스러울 수 있습니다. David Nehme의 논평에서 본래의 질문에 대한 답을 찾았습니다. –

+2

@Srini K, 믹스 인을 사용하는 것은 어느 정도까지는 "동시에 여러 클래스 사용"과 같습니다. 루비에서는 자바와 달리 가장 기본적인 빌딩 블록은 클래스가 아니라 모듈 (클래스는 클래스를 상속받습니다)입니다. mixins를 사용할 때, 효과는 다중 상속처럼 느껴질 수 있지만, 루비는 모듈이 포함 된 순서대로 각 모듈을 상속 체인에 삽입하는 것입니다. – d11wtq