문제

자바에서 믹스 인이나 특성을 모방하는 방법이 있습니까? 기본적으로 여러 상속을 수행하는 방법이 필요하므로 여러 클래스에 공통 비즈니스 로직을 추가 할 수 있습니다.

도움이 되었습니까?

해결책

나는 모든 비즈니스 로직을 새로운 클래스로 캡슐화 할 것입니다. BusinessLogic 그리고 필요한 각 수업이 필요합니다 BusinessLogic 수업에 전화하십시오. 수업에 전화를 걸어 한 단일 루트 상속인이 필요한 경우 BusinessLogic, 당신은 인터페이스도 만들어야합니다 (BusinessLogicInterface?)

의사 코드에서 :

interface BusinessLogicInterace
{
    void method1();
    void method2();
}

class BusinessLogic implements BusinessLogicInterface
{
    void method1() { ... }
    void method2() { ... }
}

class User 
    extends OtherClass 
    implements BusinessLogicInterface
{
    BusinessLogic logic = new BusinessLogic();

    @Override
    void method1() { logic.method1(); }

    @Override
    void method2() { logic.method2(); }
}

이것은 여러 상속 부족을 중심으로하는 가장 예쁜 구현이 아니며 인터페이스에 많은 방법이있을 때 매우 번거롭게됩니다. 아마도 믹스 인이 필요하지 않도록 코드를 재 설계하고 싶을 것입니다.

다른 팁

당신이하고 싶은 방식이 아닙니다. 효과적인 자바 "상속에 대한 구성을 선호하는"것을 권장합니다. 즉, 공통 논리를 다른 클래스로 옮기고 대의원으로 옮깁니다. 이것이 Java에서 여러 상속 재산이 부족한 방법입니다.

오늘 대상-urist가 오늘 당신 안에서 흔들리고 있습니까?

조금만 할 수 있다고 생각하십시오 복합 지향 프로그래밍?

그러면 당신은 찾고 있습니다 아파치 폴리 겐 (이전 Qi4J 또는 Zest);)

다중 상속에 대한 Java의 답변은 여러 인터페이스를 구현하는 기능입니다. 물론 이것은 방법 선언을 얻지 못하지만 논리는 아닙니다.

구성별로 믹스 인을 모방 할 수 있습니다. Java 클래스는 공통 비즈니스 로직을 수행하는 다른 클래스를 나타내는 멤버 변수를 정의 할 수 있습니다.

Java 클래스를 설계 할 때, 나는 건축의 디자인을 억제하기 위해 C ++ 스타일 다중 상속의 부족을 발견하지 못했습니다. 당신은 당신이하고 싶은 일을 성취 할 수있는 방법을 찾을 것입니다.

Qi4J를 사용하면 Mixins를 사용할 수 있습니다

인터페이스가 중첩 클래스 (자동 공개 정적)가 인터페이스 자체 내에서 캡슐화 된 인터페이스 메소드의 기본 구현을 유지하도록 허용한다는 사실을 악용 할 수 있습니다. 즉, 인터페이스 내부의 Alex B의 예제 비즈니스 클래스를 움직입니다.

이것은 Scala가 여기에 설명 된대로 특성에 대한 JVM 코드를 생성하는 방식과 유사합니다. 스칼라 특성은 어떻게 Java 바이트 코드로 컴파일됩니까?

이 작업을 수행하면 예제는 다음과 같습니다.

interface BusinessLogicInterface {
    void method0();

    class DefaultImpl {
        private DefaultImpl() {
        }

        public static void method1(BusinessLogicInterface self) { ... }
        public static void method2(BusinessLogicInterface self) { ... }
    }

    void method1();
    void method2();
}

class User extends OtherClass implements BusinessLogicInterface {
    @Override
    void method0() { ... }

    @Override
    void method1() { BusinessLogic.defaultImpl.method1(this); }

    @Override
    void method2() { BusinessLogic.defaultImpl.method2(this); }
}

인터페이스 유형의 객체를 "자체"매개 변수로 전달합니다. 이것은 비즈니스 로직이 다른 추상 방법을 사용할 수 있음을 의미합니다 (Method0). 이는 서로 직교 및 이러한 직교 방법으로 구현 될 수있는 유틸리티 "확장"방법을 갖춘 추상적 인 방법으로 특성을 만드는 데 매우 유용 할 수 있습니다.

단점은 각 인터페이스가 보일러 플레이트 위임 코드를 복사/붙여 넣어야한다는 것입니다. 이 단점이없는 Java에서 자주 사용되는 또 다른 패턴 (그러나 원조가 적고 메소드를 호출하는 OO 방법이 적음)은 정적 메소드를 포함하는 인터페이스로 복수 이름을 가진 클래스를 작성하는 것입니다. 이것은 수집 유틸리티 클래스에 사용됩니다.

cglib/javassit을 사용하여 Java에서 간단한 믹스/특성 지원을 구현하는 것은 매우 쉽습니다. 예를 들어 살펴볼 수 있습니다 여기 작은 예를 들어. 보다 완전하고 사용할 수있는 솔루션을 찾을 수 있습니다. 여기

Java-8 현재 기본 인터페이스 방법이 추가되었습니다. 이것은 Java의 여러 인터페이스 상속과 함께 일종의 믹스 인을 허용해야합니다. 분명히 인터페이스는 독립적으로 작동해야합니다. 따라서 상당한 한계가있을 것입니다.

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