如何在多个类之间进行通信?

时间:2014-08-14 03:34:23

标签: java oop instantiation

我有三节课。例如,我将它们称为AwesomeClass,CoolClass,PrettyClass。 AwesomeClass实例化CoolClass和PrettyClass的对象。现在,我希望CoolClass更改PrettyClass中的变量。

最好的方法是什么?我能想到的一种方法是将PrettyClass的引用发送到CoolClass,然后CoolClass可以执行instanceOfPrettyClass.setSomeVariable("42");之类的操作。或者我可以将AwesomeClass视为控制器,将其他两个类视为视图(这是他们正在使用的),并让CoolClass在AwesomeClass中调用一些方法,然后在PrettyClass中调用另一个方法,但这感觉非常混乱。

编辑一些示例代码

public class AwesomeClass
{
    public AwesomeClass()
    {
        CoolClass coolClass = new CoolClass();
        PrettyClass prettyClass = new PrettyClass();
    }
}

public class CoolClass
{
    public CoolClass()
    {
        Color colour = Color.RED;
    }
}

public class PrettyClass
{
    public PrettyClass()
    {
        //I want to set coolClass's colour to Color.BLACK here
    }
}

3 个答案:

答案 0 :(得分:2)

我很惊讶没有人回答这个问题。我认为你有正确的想法,虽然可能会倒退。

public class AwesomeClass
{
    public AwesomeClass()
    {
        CoolClass coolClass = new CoolClass();
        PrettyClass prettyClass = new PrettyClass( coolClass );  // change
    }
}

public class CoolClass()
{
    private Color colour;  // change

    public CoolClass
    {
        colour = Color.RED;  // change
    }

    public void setColor( Color color ) {  // add setter
      colour = color;
    }
}

public class PrettyClass
{

    public PrettyClass( CoolClass cc )  // change
    {
        //I want to set coolClass's colour to Color.BLACK here
        cc.setColor( Color.BLACK );  // change
    }
}

我认为就是这样。

答案 1 :(得分:1)

你可以使用构造函数来完成:

public class CalledClassA {
        public void doCalledClassA() {..} 
}

public class CalledClassB {
   private CalledClassA calledClassA;
   public CalledClassB(CalledClassA calledClassA) {
      this.calledClassA = calledClassA;
   }

   public void doSomething() {
      calledClassA.doCalledClassA();
   }
}

或使用上面建议的setter。 由于以下原因,我更喜欢使用承包商:REPEAT AFTER ME: SETTER INJECTION IS A SYMPTOM OF DESIGN PROBLEMS

答案 2 :(得分:0)

我们可以申请静态方法"设置"在CoolClass?我们不需要在" PrettyClass"中传递参考作为参数。那种情况下的构造函数。任何时候我们想要改变颜色,只需使用CoolClass.set(...)来做。