3

C# 拡張メソッドは、既に閉じられているクラス定義に新しいメソッドを追加できるという点で理解しています。Java 防御/拡張メソッドは、まったく別のもののようです。例えば:

public interface Interfacable {
    public void regular();
    public default void defender() { System.out.println("I am protected"); };
}

さて、Java 拡張メソッドを使用して「trait-y」を実行できることはわかりましたが、同じことをしないと思われる場合、なぜ同じこと (「拡張」) と呼ばれるのかわかりません。誰かがこれで私を助けることができますか?

4

1 に答える 1

5

これらが追加された理由は、コレクション クラスなどへの簡単なアップグレード パスが存在するように、Java にクロージャを追加したことの一部でした。クロージャーの追加に伴う課題は、標準コレクションに追加したい関数が非常に多くなってきていることです。ただし、それらを既存のインターフェイスに追加すると、それらのインターフェイスの実装が壊れます。これを回避する方法は、新しいメソッドを使用して追加のインターフェイスを追加することです。これは、仮想拡張メソッドを使用しなくても可能ですが、独自の欠点があります。つまり、その新しいインターフェースの実装は、使用する前に追加する必要があります。現在、おそらく多くの実装が存在するため、それらすべての実装をアップグレードするには長い時間がかかる場合があります。でも、同時に、追加したいメソッドが実装にとらわれない方法です。少なくとも基本的なケースでは、基本的に同じことを行う必要があります。これを構築したチームがケースを処理することを決定した方法は、オーバーライド可能なデフォルトの動作の仕様を有効にすることでした。このようにインターフェースを追加すると、機能がそこにあり、ライブラリの作成者が別の実装を作成するかどうかを決定する必要があります。重要なのは、そうする必要がないこと、またはそうするまでの一時的なギャップ機能があることです。このようにインターフェースを追加すると、機能がそこにあり、ライブラリの作成者が別の実装を作成するかどうかを決定する必要があります。重要なのは、そうする必要がないこと、またはそうするまでの一時的なギャップ機能があることです。このようにインターフェースを追加すると、機能がそこにあり、ライブラリの作成者が別の実装を作成するかどうかを決定する必要があります。重要なのは、そうする必要がないこと、またはそうするまでの一時的なギャップ機能があることです。

要するに、それらは基本的に特性のように機能し、C# の拡張メソッドと同じではないということです。私が読んだところによると、これの元の実装はより C# でした。ただし、スタイルの制限 (つまり、機能をオーバーライドできない) とリフレクションを使用できないため、それらをそのように使用するという決定は、それらを発見します。実装へのアプローチが変更されたにもかかわらず、名前が残っているようです。

詳細については、仮想拡張メソッドの説明を参照してください

于 2013-06-22T23:42:14.670 に答える