문제

우선, 나는 언어 이론에 대해 아무것도 알지 못하고 Java를 제외한 다른 언어를 거의 알지 못하지만, 나는 시원하다고 생각한다는 생각이 있었지만, 당신은 나에게 말해야합니다.
A : 왜 짜증나
B : 언어 X가 몇 년 동안 어떻게 지 냈는지
C : 내 마음이 어떻게 짜증나 는가
D : 위의 모든 것

아이디어는 구성과 동일한 코드 재사용의 용이성을 제공 할 것입니다. extends 하다.

따라서 다음과 같은 수업이 있다면 다음과 같습니다.

public interface A {  
    public void methodInA();  
}

그리고 당신은 다음과 같은 수업을 받았습니다.

public class B {  
    private composed A;
    public B() {
        // construct A within constructor
    }
}

그런 다음 다음을 수행 할 수 있습니다.

B myB = new B();
myB.methodInA();

B의 클래스에서 대표단을 추가 할 필요없이. 그러나 당신은 또한 상속과 같은 일을 할 수 있습니다.

@Overrides
public void methodInA(){
    // B's own delegation method
}

단점은 다음과 같습니다.

  • 메소드는 소스 코드에 숨겨져있어 호출이 어디에서 왔는지 덜 분명하지만 이런 경우도 마찬가지입니다. extends
  • 작곡 된 필드가 동일한 방법 서명을 공유하는 경우 충돌이 해결되어야합니다 (충돌하는 인터페이스가 어떻게이를 해결합니까?)
  • 같은 유형의 여러 구성된 필드를 원한다면, 필드가
  • 아마 내가 생각하지 않은 다른 100 가지

내가 말했듯이, 나는 분명히 언어 이론가가 아니며, 그것에 대해 생각하는 나이를 보냈다. 그 아이디어는 내 머리에 튀어 나왔고 나는 내가 얼마나 잘못되었는지 알고 싶었다. 나는 그것이 멋질 것이라고 생각합니다.

도움이 되었습니까?

해결책

클래스 가이 기능 만 사용하여 단일 클래스를 작성할 수 있도록 제한을 제한했다면 다소 유용하고 논의되는 많은 두통을 피할 수 있다고 생각합니다.

개인적으로 나는 콘크리트 클래스의 상속을 싫어합니다. 나는 Bloch 's의 항목 14의 큰 지지자입니다. 효과적인 자바, 내유에 대한 구성을 선호합니다. 나는 이와 같은 것이 해당 항목에서 권장하는 관용구를 더 쉽게 구현할 수 있다고 생각합니다.

솔직히, 당신이 무엇을하고 있는지 정말로 알고 있다면 이것을 처리 할 컴파일러 주석을 쓸 수 있습니다. 따라서 인터페이스 IBAR을 구현 한 클래스 바가 있다고 가정하면 클래스는 다음과 같습니다.

public class Foo {

  @Delegate(IBar.class)
  private Bar bar;

  // initialize bar via constructor or setter
}

그런 다음 편집 중에 FOO는 IBAR을 구현하기 위해 만들어 질 수 있으며 FOO가 아직 구현하지 않은 해당 인터페이스의 메소드는 다음과 같이 생성됩니다.

public Baz method1(Qux val) {
  return bar.method1(val);
}

위에서 언급했듯이 수업 당 하나의 필드만이 주석을 사용할 수 있다는 제한을 제한하고 싶을 것입니다. 여러 필드 에이 주석이 있으면 컴파일 오류를 던지고 싶을 것입니다. 또는 전달 된 매개 변수로 어떤 종류의 우선 순위 모델을 인코딩하는 방법을 찾을 수 있습니다.

이제 나는 이것을 썼으므로 시원해 보입니다. 어쩌면 나는 다음 주에 그것을 가지고 놀겠다. 내가 무엇이든 알아낼 수 있다면 이것을 업데이트하겠습니다.

다른 팁

그것은 시원하게 들리지만 나는 그것이 끔찍한 언어 구성을 만듭니다. 동일한 클래스의 하나 이상의 '구성'을 선언한다면 문제가 있지만, 콜이 (다른) 작곡 클래스 중 하나 이상에서 메소드와 일치하는 경우는 어떻습니까? 메인 클래스에서 어떤 것을 호출했는지 지정해야하며,이를 위해 추가 구문이 필요합니다. 수업에 공개 회원이 있으면 상황이 더욱 악화됩니다.

구성은 다중 상속의 문제를 방지하는 데 사용됩니다. 이와 같은 구성을 허용하면 적어도 호출 할 방법을 해결하는 데있어 다중 상속을 효과적으로 허용합니다. Java와의 주요 디자인 결정은 여러 상속을 허용하지 않았기 때문에 (좋은 이유로) 이것이 Java에게 소개 될 것 같지는 않습니다.

그래도이 작업을 수행하는 데 분명한 이점이 있는지 확실하지 않습니다. 나는 당신이 만드는 요점을 이해합니다. 현재 A에서 메소드를 호출하려면 myb.getainstance (). methodina ()를 사용해야하지만 Myb.Methodina ()를 만들고 싶습니다.

그러나 여러 인스턴스가 있으면 어떻게됩니까? 메소드 호출은 어떻게 해결됩니까? 여러 번 구성은 하나에서 많은 연관성을 의미하므로 B에는 많은 사례가 있습니다. 그러면 어떻게됩니까?

나는 당신의 단점에 동의합니다. 그것은 단순히 가치있는 것보다 너무 많은 혼란을 유발할 수 있습니다.

일부 언어로 "Mixins"라는 것을 확인하고 Perl 5 Moose OO 시스템의 "역할"을 확인하십시오.

또한 차이가 있습니다 구성 그리고 집합 고려하다. 컴파일러는 당신이 'is-a'또는 'has-a'관계를 의미하는지 어떻게 알 수 있습니까?

  • 전체 객체 그래프가 쓰레기 수집 또는 그래프 헤드 만 사용할 수 있습니까?

ORM 매핑 도구 및 프레임 워크 중 몇 가지가 belongsTo 또는 has-many 지속적인 물체와 일부는 계단식 삭제 (구성 용)를 제공합니다. 나는 당신이 찾고있는 간단한 구문 설탕을 제공하는 하나의 오프 손을 모른다.

실제로, Groovy의 메타 클라스와 메타 프로 그램 조용 관용구는 '자동 마그 틱'대표단과 매우 유사한 것을 제공 할 수 있습니다.

C ++에서는 다중 상속이 허용되며, 나는 다르다는 것을 알고 있지만 동일한 사고 과정에 따라 다릅니다. Java는 여러 상속을 허용하지 않도록 설계되어 혼란이 적어 버그와 악용이 가능합니다.

당신이 제안한 것은 Java의 원칙과 직접 충돌하는 것입니다.

그렇게 말했듯이, 그것은 시원 할 것입니다 (반드시 유용하지는 않습니다). 저는 C ++에서 전환 한 Java 프로그래머입니다. 나는 내 자신의 실수를 할 수있는 것을 좋아합니다.

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