这是一个私人班级" P"在A.java中(" P"在A.java中使用了一些方法),B.java如何访问" P"?

时间:2014-02-25 23:48:00

标签: java

好的,我在Order.java中有一个private class MyClickHandler。我希望Customer.java能够使用MyClickHandler,但我不想将private class MyClickHandler的确切代码复制到B.java。

然而,问题是MyClickHandler也使用Order.java中的一些方法。幸运的是,这些方法也需要在Customer.java中使用。

Order.java

public class Order{
    private class MyClickHandler implements ClickHandler{
        CheckBox myCheckBox;
        MyTextColumn myTextColumn;
        public MyClickHandler(CheckBox myCheckBox, MyTextColumn myTextColumn){
            this.myCheckBox=myCheckBox;
            this.myTextColumn=myTextColumn;
        }
        @Override
        public void onClick(ClickEvent event) {
            // TODO Auto-generated method stub
            if(myCheckBox.getValue()){
                insertColumn(myTextColumn);
            }
        }
     }
     public void insertColumn(MyTextColumn myTextColumn){
         // This method is also called by other methods in Order.java
     }
     public void removeColumn(MyTextColumn myTextColumn){
         // This method is also called by other methods in Order.java
     }

}

现在我希望Customer.java使用MyClickHandler。此外,它还需要使用方法insertColumn& removeColumn

2 个答案:

答案 0 :(得分:1)

如果不确切知道应该做什么,很难完全清理设计,但作为一个开始,我会做这样的事情:

  1. 制作所有课程public
  2. 提取常见的行为 OrderCustomer进入超类(下面名为Parent - 不好 名字!)
  3. 只需实例化MyClickHandler的实例即可 例如,Order,并将this的引用传递给它,以便您可以 以与私有方式相同的方式调用方法 类。

  4. public class Parent {
    
       public void insertColumn(MyTextColumn myTextColumn){
          // implement
       }
    
       public void removeColumn(MyTextColumn myTextColumn){
          // implement
       }
    }
    
    public class Order extends Parent{
    
        ClickHandler clickHandler;       
    
        public ClickHandler getClickHandler(CheckBox myCheckBox, MyTextColumn myTextColumn) {
             return new MyClickHandler(this, myCheckBox, myTextColumn);
        }
    
    }
    
    public class Customer extends Parent {
    
    //similar to Order
    
    }
    
    public class MyClickHandler implements ClickHandler {
    
        private CheckBox myCheckBox;
        private MyTextColumn myTextColumn;
        private Parent parent;
    
        public MyClickHandler(Parent parent, CheckBox myCheckBox, MyTextColumn myTextColumn){
            this.parent = parent;
            this.myCheckBox = myCheckBox;
            this.myTextColumn = myTextColumn;
        }
    
        @Override
        public void onClick(ClickEvent event) {
            // TODO Auto-generated method stub
            if(myCheckBox.getValue()){
                parent.insertColumn(myTextColumn);
            }
        }
    }
    

    在这里你有一个有趣的逻辑混合,有意义被

    拉出来
    • 继承 - 对于您希望在Order和Customer中实现相同的方法,即在概念上属于这些类的常见行为,因此有意义地实现为通用超类中的行为

    • 组合 - 就像你想在两个地方使用的ClickHandler实现一样 - 这是一个完全在概念上独立的逻辑模块,应该被拉出到自己的类中并且只是使用它另外两个。

答案 1 :(得分:0)

您可以创建一个公共方法,该方法可以创建MyClickHandler的新实例,也可以返回已存在的实例。

我不建议这样做,我觉得受封装保护的类会是一个更好的解决方案。