1

A空のメソッドを持つクラスを持つことは可能ですかrender()..次に、クラスの3つのインスタンスを作成し、オブジェクトを作成します。次に、b, c, d各オブジェクトのrenderメソッドに本体を割り当てることができますか?

これが例です。JavaScriptでは、オブジェクトに発言aさせてから、どこにでも発言させることができます

a.method = function() { /* do something */ }

methodその行の後に、オブジェクトの名前を持つメソッドがあり、a呼び出されるたびに/* do something */

これはJavaで可能ですか?構文は何ですか?

私の考えは、buttonクラスを持ち、それが使用されるさまざまな状況/コンテキスト内でそのインスタンスのclickメソッドにさまざまなアクションを割り当てることです。したがって、アクションごとに異なる子クラスを定義する必要はありません。

4

6 に答える 6

6

Javaでは、Javascriptのように関数を渡すことはできません。

呼び出したいメソッドを宣言するようなもの(できればもっと説明的なもの!)と呼ばれるクラスまたはインターフェースを作成する必要があります。Handler次に、次のようなことを行うことができます。

a.method = function() { /* do something */ }

しかし、あなたはそれを次のように定式化する必要があります

a.method = new Handler() {
    public void function() {
        /* do something */
    }
};

と呼びますa.method.function()

私の考えは、buttonクラスを持ち、それが使用されるさまざまな状況/コンテキスト内でそのインスタンスのclickメソッドにさまざまなアクションを割り当てることです。したがって、アクションごとに異なる子クラスを定義する必要はありません。

これはまさにSwingがそれを行う方法です。通常、次のようになります。

myButton.setAction(new AbstractAction("Click me!") {
    public void actionPerformed() {
        // do something
    }
});
于 2012-06-01T12:08:31.427 に答える
3

クラスのサブクラスを煩わしくインスタンス化し、A必要なメソッドをオーバーライドすることができます。そのようです

A a = new A(){
   @Override
   public void render(){
       //do something
   }
};
A b = new A(){
    @Override
    public void render(){
        //do something
    }
}
于 2012-06-01T12:11:07.647 に答える
1

クラスをインスタンス化したにメソッド本体を定義することはできませんが、インスタンス化するときAにメソッド本体を定義することはできます。

interface A {
  void method();
}

A b = new A() {
  @Override
  public void method() {
    //body for instance b
  }
};

A c = new A() {
  @Override
  public void method() {
    //body for instance c
  }
};
于 2012-06-01T12:10:23.833 に答える
1

いいえ、Javaではそれを行うことはできません。メソッドの実装は、そのオブジェクトの実行時型によって完全に決定されます。

ただし、戦略パターンを使用することもできます。これは、実際には標準のSwingフレームワークによって(多かれ少なかれ)行われていることです。にを設定するActionと、ボタンがクリックされると'sメソッドが呼び出されJButtonますActionactionPerformed()これは、オブジェクト間の単なる委任です。

于 2012-06-01T12:11:05.650 に答える
1

renderメソッドを持つクラスのオブジェクトを1つだけインスタンス化する場合は、委任を使用できます。クラスがヘビー級の場合は、これを実行することをお勧めします。

これは実際には戦略パターンです:

class MyClass {
    private Behavior behavior;

     public void setBehaviour(Behavior someBehaviour) {
         this.behavior = someBehavior;
     }
     public void render() {
         behavior.render();
     }
}

interface Behavior {
     void render(); 
}

class BehaviorA implements Behavior {
     public void render() {
         //do behavior A 
     }
}

class BehaviorB implements Behavior {
     public void render() {
         //do behavoir B
     }
}

class RunnerClass {
    public static void main(String[] args) {
        MyClass myClass = new MyClass();

        myClass.setBehavior(new BehaviorA()); //actually you should put a factory for behavioir
        myClass.render();//render A logic is done
        myClass.setBehavior(new BehaviorB());
        myClass.render();//render B logic is done   
    }
}
于 2012-06-01T12:36:19.343 に答える
0

正直なところ、これはJavaの純粋なポリモーフィズムのように聞こえます。これは2つの方法で実現できます。

  • 各オブジェクトが異なる方法で実装する共通のインターフェースを作成する

  • 抽象クラスボタンを定義し、抽象ボタンを拡張するb、c、dボタンを作成し、各ボタンの動作を異なる方法で定義します。

http://java.sys-con.com/node/376​​95

http://www.javaworld.com/javaworld/javatips/jw-javatip30.html

于 2012-06-01T12:17:24.060 に答える