これらは、特にこの分野では非常に異なる言語です。クラスがあるとしましょう。この場合、ユーザーコントロール(テキストボックスなど)にします。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にnull実装を提供するクラスを作成します。次に、DoSomethingをDoSomethingAdapterに置き換えます。クリーンコンパイルのためにメソッドを記述する必要はありません。プログラムを正しく動作させるために必要なメソッドをオーバーライドするだけです。そのため、C#のイベントで行ったことと一致させるために、インターフェイスが必要になり、Javaの継承を使用することになります。
これは例であり、包括的な説明ではありませんが、C#ではなくJavaに多くの継承がある理由の基本を示しています。
さて、なぜJavaはこのように機能するのですか?柔軟性。whenSomethingHappensに渡されたオブジェクトは、完全に別の場所からCleverPanelに渡された可能性があります。CleverWindowオブジェクトをどこかで支援するために、いくつかのCleverPanelインスタンスがUIControlのようなオブジェクトに渡す必要があるかもしれません。 または Uicontrolのは、のいずれかにそれを引き渡すことができ、そのコンポーネント。
さらに、アダプターの代わりに、その背後に数千行のコードがあるDoSomething実装が存在する場合があります。その新しいインスタンスを作成して渡すことができます。1つのメソッドをオーバーライドする必要がある場合があります。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でクラスをその場で簡単に作成できます。クラスは、匿名または名前付きで、1つのメソッドに深く埋め込まれた1つの小さなコードブロックでのみ参照する必要があります。完全に新規に作成することも、非常に大きな既存のクラスを少し変更することによって作成することもできます。(既存のクラスは、独自のファイルでトップレベルにすることも、トップレベルのクラスにネストすることも、コードの単一ブロック内でのみ定義することもできます)。新しいクラスインスタンスは、作成するオブジェクトのすべてのデータにフルアクセスできます。そして、新しいインスタンスを渡してプログラム全体で使用し、それを作成したオブジェクトを表すことができます。
(余談ですが、ここでは(Javaの他の場所でのように)継承の大きな用途は単にDRYの目的であることに注意してください。異なるクラスが同じコードを再利用できるようにします。 )
繰り返しますが、これは包括的な議論ではありません。ここで表面を引っ掻いているだけです。しかし、はい、JavaとC#の間で継承が使用される方法には驚くべき違いがあります。 この点で、それらは非常に異なる言語です。それはあなたの想像力ではありません。