Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
那里';“这是一门私人课”;P";在A.java中(“P”使用A.java中的一些方法),B.java如何访问;P";?_Java - Fatal编程技术网

那里';“这是一门私人课”;P";在A.java中(“P”使用A.java中的一些方法),B.java如何访问;P";?

那里';“这是一门私人课”;P";在A.java中(“P”使用A.java中的一些方法),B.java如何访问;P";?,java,Java,好的,我在Order.java中有一个私有类MyClickHandler。我希望Customer.java能够使用MyClickHandler,但我不想将私有类MyClickHandler的确切代码复制到B.java 然而,问题是,MyClickHandler在Order.java中也使用了一些方法。幸运的是,这些方法也需要在Customer.java中使用 Order.java public class Order{ private class MyClickHandler imple

好的,我在Order.java中有一个
私有类MyClickHandler
。我希望Customer.java能够使用
MyClickHandler
,但我不想将
私有类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
您可以创建一个公共方法来创建MyClickHandler的新实例或返回一个已经存在的实例


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

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

  • 将所有类
    公开
  • 提取
    Order
    Customer
    进入一个超类(名为
    Parent
    以下-错误 名字!)
  • 只需在for中实例化
    MyClickHandler
    的一个实例 例如,
    Order
    ,并向其传递对
    this
    的引用,以便 对它调用方法的方式与对私有对象调用方法的方式相同 班级

  • 在这里,你有一个有趣的逻辑组合,可以用

    • 继承-对于要在顺序和客户中实现相同的方法,即概念上属于这些类的常见行为,因此在超类中实现为泛型行为是有意义的

    • 组合——正如您希望在这两个地方使用的ClickHandler实现一样——这是一个在概念上完全独立的逻辑模块,应该将其拉入自己的类中,只供其他两个使用


    它必须是私人课程吗?您可以在一个单独的java文件中创建一个公共类或包保护类,这样两者都可以访问。Order.java&Customer.java是的,我们可以将MyClickHandler公开,但是我们如何将两个方法insertColumn和removeColumn一起带来呢?文件是Order.java,所以我们称之为Order类。我们可以将类似父类的实用程序类和所有方法insertColumn和removeColumn设置为静态吗?类继承仍然没有被禁止吗?我肯定会选择组合和委派,而不是创建另一个类层次结构。@Denis,所以我们将insertColumn&removeColumn放入实用程序类,或者像davnicwil的解决方案那样扩展父类?或者你有其他的解决方案吗?@Tum你几乎可以做你想做的事情,并让它工作-这实际上是关于如何以Java提供给我们的构造最干净的方式提取逻辑-执行上述操作只是一个建议-但我肯定认为它比使用几乎总是邪恶的静态实用程序方法更干净:-)@Denis,为什么实用类中的静态方法是邪恶的?
    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);
            }
        }
    }