2012-01-08 45 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; 
    } 
} 
相关问题