2012-01-08 42 views
-1

我想知道爲什麼傳遞一個父級子類的兩級對象Command不起作用。爲什麼傳遞一個Command對象不起作用?

這樣的(A類B的父和B是C的親本):

Class A (Creates the instance of the Command object that is passed down to B) 

+-- Class B (Pass down the object to C) 


+------- Class C (Callsthe execute() method of the Command object) 

然而,當在B類中創建命令對象的實例和向下傳遞到C類它工作正常。

例子:

編輯:

例(手寫代碼):

public class A { 
    private Command command; 
    private B b; 
    public A() { 
    b = new B(); 
    command = new Command() { 
      public void execute() { 
      // Do something 
      } 
    } 
    b.setCommand(command); 
    } 

public class B { 
    private Command command; 
    private C c; 

    public B() { 
    c = new C(); 
    c.setCommand(this.command); 
    } 

    public void setCommand(Command command){ 
     this.command = command; 
    } 

} 


public class C { 
    private Command command; 
    public C() { 

    } 

    public void doStuff() { 
     command.execute(); 
    } 
    public void setCommand(Command command){ 
     this.command = command; 
    }   
} 
+1

目前尚不清楚你的圖是什麼意思 - 顯示的代碼將使其更加清晰,最好是在一個簡短而完整的例子,只要是可行的。 – 2012-01-08 09:18:30

+0

A類是B的父親,B是C的父母。 – xybrek 2012-01-08 09:19:32

+0

你能澄清一下「不起作用」是什麼意思嗎?當你執行它時會發生什麼?請注意,這裏沒有涉及繼承,與此處「父母 - 孩子」的含義相反。 – 2012-01-08 09:32:44

回答

0

問題是向下傳遞的過程中,從一個類的命令對象被分配到B類,其是B類的本地命令對象被髮送到C類

+0

換句話說,這個對象就像中間的「緩衝」。它現在可以工作,因爲我所做的只是確保B類只是將對象傳遞給C而無需修改。 – xybrek 2012-01-08 09:38:40

1

是命令對象公開的訪問修飾符?

2

從本地命令對象示例代碼,它由一次調用c.setCommand()(在B的構造函數)是明顯的this.command尚未使用Command例如,從通過更新:

b = new B(); 
// here, c.setCommand() has already been called with b.command, which hasn't been initialized, so is 'null' 
b.setCommand(command); // sets b.command, but doesn't change c.command's value, which is then still 'null' 

步進通過帶調試器的代碼可以在幾秒鐘內發現bug的來源。這是Java 101.

+0

Yah,但是我在這裏發佈的代碼與Java-to-Javascript編譯器一起使用,因此調試並不那麼容易。 – xybrek 2012-01-08 15:58:38

+1

在GWT中進行調試與其他任何環境一樣簡單,至少當錯誤出現在您的Java代碼中時:在DevMode中運行您的代碼,以便運行Java代碼(不會轉換爲JS),並且可以使用任何Java調試器。在Eclipse中:調試爲...→Web應用程序。 – 2012-01-08 19:22:18

0

Oooo ...您需要在對象實例化的序列上進一步教育。

  • 您實例化了B對象。
  • 然後在C對象的實例化中,爲C對象分配B對象的命令。
  • 在那一刻該命令爲空。
  • 那麼只有你指定的對象B的命令,這是爲時已晚,因爲你應該傳遞的命令爲B.

A類的構造函數:

public class A { 
    private B b; 
    public A() { 
    b = new B(
     new Command() { 
     public void execute() { 
      Window.alert("Gotcha"); 
     } 
     } 
    ); 
    } 

B類:

public class B { 
    private C c; 

    public B(Command cmd) { 
    c = new C(); 
    c.setCommand(cmd); 
    c.doStuff(); 
    } 
} 

C類:

public class C { 
    private Command command; 
    public C() { 
    } 

    public void doStuff() { 
    command.execute(); 
    } 

    public void setCommand(Command command){ 
    this.command = command; 
    }   
} 

或者說,爲什麼不是這個

public class B { 
    private C c; 

    public B(Command cmd) { 
    c = new C(cmd).doStuff(1000); 
    } 
} 

public class C { 
    private Command command; 
    public C(Command cmd) { 
    this.command = cmd; 
    } 

    public C doStuff(int i) { 
    if (--i>0){ 
     new C(cmd).doStuff(i); 
    }  
    command.execute(); 
    return this; 
    } 
} 
相關問題