3

インターフェイスを実装するクラスがあり、メソッドの 1 つは onClick と呼ばれます。インターフェイスが必要とする onClick を実装する方法はありますが、別の名前を付けますか? 次のようなもの(そして私はこれを作っています):

public void AnyMethodNameIWant() implements Interface1.onClick

私が尋ねている3つの理由は次のとおりです。

  1. メソッドのシグネチャを見て、それがインターフェイスから来ていることを知っておくとよいでしょう。
  2. インターフェイスで必要になる可能性のある onClick のような「一般的な」名前を避けるため
  3. 多くのインターフェイスで同じメソッド名を区別するには

私はJavaが初めてなので、これが根本的に「悪い」質問である場合はお詫びします。

4

5 に答える 5

6

いいえ、できません。インターフェイス、Java で同じ名前のメソッドによって実装する必要があります。

ただし、(Java 6 の時点で) インターフェース実装でアノテーションを使用できます@Override。これは、これが任意に名前を変更できないメソッドであることを明確にするのに役立ちます。

2 番目の問題の 1 つのオプションは、より具体的なメソッドへの呼び出しを転送するためだけに実装クラスを作成することです。ネストされたクラスまたは匿名クラスとしてこれを行うことができます。私は通常これを行うかどうかはわかりませんが。

編集: 3 番目の質問を見た - いいえ、Java で同じメソッド シグネチャを持つ 2 つのインターフェイスがある場合、実装を 1 つしか提供できません:(ああ、シグネチャが同じで戻り値の型が異なる 2 つのインターフェイスがある場合は、さらに悪いことに、メソッドを「メイン」クラスにInterface1 getInterface1()プロキシする匿名の内部クラスのインスタンスを返すメソッドをいつでも作成できます。Interface1

于 2011-10-01T10:35:29.643 に答える
2

その2点

  • インターフェイスで必要になる可能性のある onClick のような「一般的な」名前を避けるため
  • 多くのインターフェイスで同じメソッド名を区別するには

通常、Adapter Patternを使用して解決されます。

interface IFoo {
    void onClick();
    void onChange();
}

class MyImpl {
    void doSomething(){
        // real code for onClick 
    }
    void doSomethingElse(){
        // real code for onChange
    }

    IFoo getFooAdapter(){
        return new IFoo() {
            @Override
            public void onClick() {
                doSomething();
            }

            @Override
            public void onChange() {
                doSomethingElse();
            }
        };
    }
}

基本的に、任意のインターフェイス メソッドへのすべての呼び出しを実際の実装に転送する中間ステップを作成します。

命名と署名は異なる場合があります。必要に応じて、異なるインターフェースに異なるアダプターを提供することもできます (または、両方のインターフェースが異なる動作で競合するメソッドを持っている場合は必要です)。

アダプター インスタンスを配布する方法はいくつかあります。状況によっては、毎回新しいインスタンスを作成するのは賢明ではない場合があります。

もちろん、このパターンは単に楽しみのために実装したり、最小限でクリーンなコードのために実装したりするものではありません。しかし、それは実際の問題を解決することができます。

于 2011-10-01T11:20:26.783 に答える
2

いいえ。

できることは、インターフェイスを実装してメソッドを呼び出すシャドウ メソッドを追加することだけです。

public class MyClass implements Interface1 {
    public void AnyMethodNameIWant() { ...; }
    public void onClick() { AnyMethodNameIWant(); }
}
于 2011-10-01T10:36:30.657 に答える
1

メソッドの名前を変更することはできませんが、両方のメソッド (onClickanyMethodNameIWant) を定義してonClick、もう一方のメソッドを呼び出すだけで済みます。

@Override
public void onClick() {
    anyOtherMethodNameIWant();
}
于 2011-10-01T10:36:31.843 に答える
1

もちろん、同じ実装を指す別の名前のメソッドを追加して、必要な名前を付けることができます。

public void interfaceMethodA(){
   // some implementation here
}

public void AnyMethodNameIWant(){
    interfaceMethodA();
}
于 2011-10-01T10:38:39.050 に答える