이들은 특히이 분야에서 매우 다른 언어입니다. 수업이 있다고 가정 해 봅시다. 이 경우 텍스트 상자와 같은 사용자 정의 컨트롤로 만듭니다. 그것을 UIControl이라고 부릅니다. 이제 우리는 이것을 다른 수업에 넣고 싶습니다. 이 예제에서는 UI를 사용하고 있으므로이를 CleverPanel 클래스라고합니다. CleverPanel 인스턴스는 다양한 이유로 UIControl 인스턴스에서 발생하는 일에 대해 알고 싶어합니다. 이것을하는 방법?
C #에서 기본 접근 방식은 다양한 이벤트를 확인하여 각각의 흥미로운 이벤트가 트리거 될 때 실행할 메소드를 설정하는 것입니다. 이벤트가없는 Java에서 일반적인 솔루션은 다양한 "이벤트"처리 방법이있는 객체를 UIControl 메서드에 전달하는 것입니다.
boolean stillNeedIt = ... ;
uiControl.whenSomethingHappens( new DoSomething() {
public void resized( Rectangle r ) { ... }
public boolean canICloseNow() { return !stillNeedIt; }
public void closed() { ... }
...
} );
지금까지 C #과 Java의 차이점은 심각하지 않습니다. 그러나 C #에는 필요하지 않은 DoSomething 인터페이스가 있습니다. 또한이 인터페이스에는 대부분 필요하지 않은 많은 메소드가 포함될 수 있습니다. C #에서는 해당 이벤트 만 처리하지 않습니다. Java에서는 모든 인터페이스 메소드 DoSomethingAdapter에 대해 널 구현을 제공하는 클래스를 작성합니다. 이제 우리는 DoSomething을 DoSomethingAdapter로 대체하고 깨끗한 컴파일을 위해 메소드를 전혀 작성할 필요가 없습니다. 우리는 프로그램을 올바르게 작동시키는 데 필요한 방법을 재정의합니다. 우리는 인터페이스를 필요로 결국 그래서 그리고 우리는 C #에서 이벤트와 무슨 짓을했는지에 맞게 자바에서 상속을 사용.
이것은 포괄적 인 토론이 아닌 예이지만 C #과는 달리 Java에 왜 많은 상속이 있는지에 대한 기본 사항을 제공합니다.
자, 왜 Java가 이런 식으로 작동합니까? 적응성. whenSomethingHappens가 다른 곳에서 CleverPanel로 완전히 전달되었을 때 전달 된 객체입니다. CleverWindow 객체를 어딘가에 돕기 위해 여러 CleverPanel 인스턴스가 UIControl과 유사한 객체로 전달되어야 할 수도 있습니다. 또는 UIControl 중 하나에 넘겨 수 의 구성 요소.
또한 어댑터 대신 수천 줄의 코드가있는 DoSomething 구현이있을 수 있습니다. 새로운 인스턴스를 만들어 전달할 수 있습니다. 한 가지 방법을 재정의해야 할 수도 있습니다. Java의 일반적인 트릭은 다음과 같은 메소드를 사용하여 큰 클래스를 갖는 것입니다.
public class BigClass implements DoSomething {
...many long methods...
protected int getDiameter() { return 5; }
}
그런 다음 CleverlPanel에서 :
uiControl.whenSomethingHappens( new BigClass() {
@Override
public int getDiameter() { return UIPanel.currentDiameter; }
} );
오픈 소스 Java 플랫폼은이 작업을 많이 수행하므로 프로그래머가 예제를 따르고 단순히 사용하기 위해 더 많은 노력을 기울이는 경향이 있습니다. 언어의 기본 디자인은 Sun의 프레임 워크 디자인 과 프레임 워크를 사용 하지 않을 때 기술을 사용하는 Java 프로그래머의 기본이라고 생각합니다 .
Java에서 즉시 클래스를 작성하는 것은 정말 쉽습니다. 익명 또는 명명 된 클래스는 하나의 메소드에 깊이 묻혀있는 하나의 작은 코드 블록에서만 참조하면됩니다. 완전히 새로운 클래스를 만들거나 매우 큰 기존 클래스를 약간 수정하여 만들 수 있습니다. 기존 클래스는 자체 파일에서 최상위 수준이거나 최상위 클래스에 중첩되거나 단일 코드 블록 내에서만 정의 될 수 있습니다. 새 클래스 인스턴스는 모든 생성 객체의 데이터에 대한 전체 액세스 권한을 가질 수 있습니다. 그리고 새 인스턴스는 프로그램 전체에 전달되어 사용되어 인스턴스를 만든 객체를 나타냅니다.
(여기서, Java의 다른 곳에서와 같이 여기에서 상속을 많이 사용하는 것은 단순히 DRY 목적으로 만 사용되며 다른 클래스가 동일한 코드를 재사용 할 수있게합니다. 또한 Java에서 쉽게 상속 할 수 있다는 점에 유의하십시오. )
다시 말하지만 이것은 포괄적 인 토론이 아닙니다. 나는 여기에 표면을 긁적입니다. 그러나 그렇습니다 .Java와 C # 사이에서 상속이 사용되는 방식에는 놀라운 차이가 있습니다. 이런 점에서 그들은 매우 다른 언어입니다. 당신의 상상이 아닙니다.