Windows Forms / Swing 프레임 워크가 컴포지션 대신 상속을 선호하는 이유는 무엇입니까?


12

오늘 내 교수는 SWT의 철학이 작곡에 의해 자신의 컨트롤을 만드는 것 중 하나이지만 스윙은 상속을 선호하는 것처럼 보인다고 말했다.

나는 두 프레임 워크와 거의 접촉하지 않지만 C #의 Windows Forms에서 기억하는 것에서 일반적으로 Swing과 마찬가지로 컨트롤을 확장합니다.

사람들이 일반적으로 상속보다 구성을 선호하는 경향이 있기 때문에 Swing / Windows Forms 사람들이 상속 대신 구성을 선호하지 않는 이유는 무엇입니까?


2
15 ~ 20 년 동안 이러한 API가 많이 사용되었습니다. 렌더링 엔진에는 스크린 객체를 임의의 구체적 클래스 "하루에"로 바인딩시키는 마법의 XML 접착제가 없었습니다.;)

1
내가 본 대부분의 스윙 코드는 컴포지션별로 확장을 사용합니다. 교수님의 데이터가 어디 있는지 잘 모르겠습니다.

나는 스스로 구성 대신 상속을 통해 인터넷에서 많은 스윙을 보았습니다. 주로 자습서입니다. 그러나 창 양식은 실제로 거의 전적으로 상속에 의해 사용됩니다!
삼키는 elysium

답변:


7

JComponent노출 많은 기능을 . 경우 JComponent인터페이스이고 구성 요소는 구성으로 구현되었으며, 간단한 구성 요소는 사소한 방법 래퍼, 예를 들면 수십를해야합니다

class MyComponent implements JComponent {
    JPanel panel;
    public boolean contains(int x, int y) {
        return panel.contains(x, y);
    }
    ...
}

또한 컴포지션보다 상속 비용을 선호하는 효율성 이유도 있습니다. 즉, 비용을 무시하지 않고 ( super콜을 가정하지 않음 ) 컴포지션 비용은 추가 비용 INVOKEVIRTUAL입니다. 이것이 Swing의 디자인에 영향을 미쳤는지 모르겠지만 컬렉션 클래스에는 큰 관심사입니다.


2

Swing Framework는 실제로 Composite Design Pattern에 따라 설계되었습니다. 거기에 많은 상속이 있음을 인정했지만, 일반적으로 작곡을 사용하여 자신의 양식을 작성합니다. 즉, 형태는 중간 레벨 용기와 컨트롤의 구성입니다.


"즉, 형태는 중간 레벨 용기와 컨트롤의 구성입니다." 확실한. 그러나 일반적으로 사람들이 자신의 창을 만들거나 Swing에서 호출되는 것을 만들 때 컴포지션을 사용하는 대신 창 클래스에서 상속한다는 것입니다.
삼키는 elysium

@devoured elysium 맞습니다. 그러나 양식을 만들려면 구성을 사용합니다. 그래서 그것은 약간의 상속과 많은 구성입니다.

@ devoured, 나는 그들이 사용하는 자습서가 간결성을 선호하기 때문에 모범 사례를 따르지 않는다는 것을 깨닫지 못하는 사람들의 경우라고 생각합니다.
피터 테일러

1

Java를 사용하면 모든 것이 가상 이기 때문에 상속을 사용 하는 것이 훨씬 쉽습니다 . JTable / JFrame에서 "기능"을 수정해야합니까? 확장하고 문제 메서드를 재정의 한 다음 대신 테이블 / 프레임을 사용하십시오.

데이터 바인딩이 디자인의 주요 기능인 WPF와 같은 것으로 생각하면 상속 대신 구성을 훨씬 쉽게 수행 할 수 있습니다.


"모든 것이 가상 "이란 무엇입니까?
Jonas

Java에서 모든 메소드는 내재적으로 가상입니다 (오버런 가능). C #에서는 메소드를으로 명시 적으로 선언 virtual하고이를 재정의하려면이를 명시 적으로으로 선언해야합니다 override. 자바에서, 당신은 당신이 볼 수있는 것을 무시할 수 있고, 서브 클래스에서 가시성을 증가시킬 수 있습니다 (서브 클래스에서 보호 된 메소드를 공개 할 수 있습니다!)
John Gardner

final기본 클래스 자체가 아닌 경우에도 Java에서 메소드를 대체 할 수 없습니다 final.
perp

사실 @perp입니다. 그러나 자바에서는 가상 을 방지 하기 위해 길을 떠나야합니다 (최종 추가) . C #은 반대의 방법이므로 가상적 이 되려면 나가야합니다 . 그리고 표준 자바 런타임의 아주 작은 비율이 최종으로 표시됩니다.
John Gardner

1

효과적인 자바 , 항목 17 블로흐 클래스가 있음을 언급 설계 상속 "재정의 방법 중 자체 사용을 문서화해야합니다." 이것의 특징은 이 구현 이라는 문구 입니다. JTableand와 같은 클래스에서 볼 수 JInternalFrame있습니다. Swing의 디자인에 의한 상속의 한 척도입니다.


-2

C # 3.5부터 상속보다 컴포지션의 개념을 허용하는 확장 방법이라는 개념이 있습니다.

이 프로세스에서는 기존 클래스에 새 기능을 렌더링하는 확장 클래스를 추가하여 기존 클래스에 확장 기능을 구현합니다.

자세한 내용 은 여기 를 참조하십시오


새 WinForms Control 클래스를 만드는 것과 관련이 없습니다. 좀 더 자세히 설명해 주시겠습니까?
피터 테일러

@Peter : 이것은 Windows Forms 클래스에만 관련이 없습니다. 이것은 우리 코드에서도 적용될 수 있습니다. 기본 클래스를 연결할 수 있도록 정적 클래스를 추가 한 다음 첫 번째 인수로 새 메소드를 추가하여 기존 클래스를 확장 할 수 있습니다. 코드를 컴파일 한 후 새로 추가 된 메소드를 기본 클래스 자체의 메소드로 가져옵니다. 이것이 구성이 나타내는 것입니다. 내가 옳았 으면 좋겠다 ..
Saravanan

1
나는 확장 방법이 무엇인지 알고 있으며 때로는 매우 유용하지만이 질문은 새로운 클래스를 만드는 다양한 접근법에 관한 것입니다.
피터 테일러

@Peter : 그렇다면 C #에 다른 놀라운 기능이 없다는 것을 이해하는 것 외에는 부분 클래스 만 사용할 수 있습니다. 당신이 알고 있다면 알려 주시기 바랍니다.
사라 바난
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.