문제

Java에서 단일 상속을 속이고 다중 상속을 구현하는 방법이 있다고 들었습니다.인터페이스를 사용하지 않고 이것을 구현하는 방법을 아는 사람이 있습니까?

그냥 호기심 ;-)

도움이 되었습니까?

해결책

물론 할 수 있지만 까다롭기 때문에 그것이 당신이 원하는 방식인지 정말로 고려해야 합니다.
아이디어는 유형 기반 상속과 결합된 범위 기반 상속을 사용하는 것입니다.내부 목적을 위해 내부 클래스가 외부 클래스의 메서드와 필드를 "상속"한다고 말하는 것은 형식적인 이야기입니다.외부 클래스가 내부 클래스에 혼합되어 있는 믹스인과 약간 비슷하지만 외부 클래스의 상태를 변경하고 해당 메서드를 사용할 수 있으므로 안전하지는 않습니다.
Gilad Bracha(주요 자바 언어 디자이너 중 한 명)는 다음과 같은 글을 썼습니다. 종이 그것에 대해 논의하고 있습니다.따라서 관련되지 않은 일부 클래스(예: 문자열 조작용) 간에 내부 사용을 위해 일부 메서드를 공유하고 싶다면 해당 하위 클래스를 필요한 모든 메서드가 있는 클래스의 내부 클래스로 생성할 수 있으며 하위 클래스는 다음을 사용할 수 있습니다. 슈퍼 클래스와 외부 클래스 모두의 메소드.

어쨌든 복잡한 클래스에는 까다로우며 정적 가져오기(Java 5부터)를 사용하여 대부분의 기능을 얻을 수 있습니다.하지만 취업 면접과 펍 퀴즈를 위한 훌륭한 질문입니다 ;-)

다른 팁

하나의다중 상속은 Java에서 지원되지 않습니다. 대신 동일한 목적을 제공하는 인터페이스가 있습니다.다중 상속을 사용하려는 경우에는 C++로 수행해야 합니다.

상속 대신 구성을 사용하는 것이 이 문제를 해결하는 방법인 경향이 있습니다.이는 실제로 테스트 가능성에도 많은 도움이 되므로 일반적으로 좋은 습관입니다.

하지만 자신의 유형이 다른 여러 유형처럼 "작동"하도록 하려면 원하는 만큼 많은 인터페이스에서 상속할 수 있습니다.하지만 분명히 이들로부터 구현 세부 사항을 "빌릴" 수는 없습니다.

Java가 다중 상속을 지원하지 않는 근본적인 이유는 C#과 동일하다고 생각합니다.모든 객체는 궁극적으로 Object에서 파생되며 동일한 기본 클래스에 대한 여러 경로가 있다는 것은 컴파일러에 대해 모호합니다.모호함 == 나쁘기 때문에 컴파일러가 이를 허용하지 않습니다.

대신 위임을 통해 다중 상속을 시뮬레이션할 수 있습니다.보다 이 기사 예를 들어.

java.lang.reflect.Proxy 인스턴스를 사용하면 약간의 속임수를 쓸 수 있습니다(저는 약간 강조합니다).

이는 실제로 추가 인터페이스를 추가하고 런타임에 해당 호출을 다른 인스턴스에 위임할 수 있게 해줍니다.

새로운 개발자를 멘토링하고 가르치는 사람으로서 누군가가 나에게 이런 코드를 보여주면 겁이 날 것입니다.Reflection은 시작하기 전에 Java를 잘 이해하고 이해해야 하는 도구 중 하나입니다.저는 개인적으로 이 작업을 한 번만 해본 적이 있는데, 제가 제어할 수 없는 일부 코드를 만들고 일부 인터페이스를 구현하는 것이었고 제가 제어할 수 없었던 다른 코드는 예상했던 것이었습니다(빠른 해킹이므로 작성할 필요가 없었습니다). 글루 코드를 너무 많이 유지합니다.)

사용 interface에스.원하는 만큼 구현할 수 있습니다.일반적으로 일부 변형을 사용할 수 있습니다. 복합 패턴(GoF) 원한다면 구현 코드를 재사용할 수 있습니다.

인터페이스 상속(본질적으로 특정 기능을 제공하기 위한 계약의 상속)과 구현 상속(구현 메커니즘의 상속)을 주의 깊게 구별해야 합니다.

Java는 다음을 통해 인터페이스 상속을 제공합니다. 구현하다 메커니즘과 당신 ~할 수 있다 다중 인터페이스 상속이 있습니다.

구현 상속은 연장하다 메커니즘이 있으며 단일 버전만 있습니다.당신은 ~ 정말 다중 구현 상속이 필요합니까?장담컨대 당신이 에펠 프로그래머가 아니라면 불쾌한 결과로 가득 차 있을 것입니다.

슈퍼클래스 세트를 명시적으로 관리하고 리플렉션을 사용하여 모든 슈퍼클래스에서 대상 메소드를 검색함으로써 이를 "시뮬레이트"할 수 있습니다.나는 이것을 프로덕션 환경에서 하고 싶지 않지만 흥미로운 장난감 프로그램이 될 수 있습니다.아마도 리플렉션을 활용하고, 즉석에서 클래스를 생성하고, 프로그래밍 방식으로 컴파일러를 호출함으로써 이상한 일을 많이 할 수 있을 것입니다.

JAVA는 다중 상속을 지원하지 않습니다.

여러 인터페이스를 구현하도록 얻을 수 있으며 일부는 이를 문제를 해결하는 방법으로 간주합니다.개인적으로 저는 아직 다중 상속을 사용해 본 적이 없어서 그 매력을 잘 모르겠습니다.

일반적으로 누군가가 C# 또는 JAVA 내에서 다중 상속을 제안하는 경우 이는 C++에서 '할 수 있다'는 사실 때문입니다.나는 '할 수 있다고 해서 그래야 한다는 뜻은 아니다'의 팬입니다.C# 및 JAVA는 이를 지원하지 않으므로 의도하지 않은 작업을 수행하도록 강제할 이유가 없습니다.이는 채택하는 데 유효한 기술인 고유한 경우가 있다는 것을 의미하는 것이 아니라 일반적으로 코드를 필요하지 않도록 리팩터링할 수 있다는 것입니다.

나는 이것에 대해 좀 더 생각하고 있었고 동적 프록시가 작동하지만(RMI(사용?) 작동 방식), 정말로 이런 종류의 기능을 원한다면 AOP(Aspect Oriented 프로그래밍)를 사용하는 것이 더 나을 것이라는 것을 깨달았습니다. AspectJ(eclipse.org/aspectj)와 같은 것입니다.

이렇게 하면 끔찍하게 취약한 상속 계층 구조 없이 의사 믹스인 상속을 제공하여 클래스에 여러 가지 다른 측면을 가져올 수 있습니다.

다른 모든 사람들이 지적했듯이 다중 상속을 원하거나 필요로 한다는 것은 일반적으로 올바른 관점에서 문제에 접근하고 있지 않음을 나타냅니다.우선 "상속보다 구성을 선호한다"는 GoF 원칙을 기억하세요!

믹스인을 Java로 가져오려는 노력이 있었습니다.이 링크를 확인하세요: http://www.disi.unige.it/person/LagorioG/jam/

내부 클래스를 사용하면 C++에서 때때로 선호하는 기능도 제공됩니다. 내부 클래스 관용구.

예, 이것이 속임수라고 말할 수 있으며 매우 흥미롭습니다. 단일 클래스에 여러 클래스를 상속할 수는 없지만 다음과 같은 클래스에 여러 인터페이스를 구현할 수 있습니다.

public class parents implements first, second{

}

하지만 인터페이스에 선언된 메서드를 재정의해야 한다는 점을 기억하세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top