好的,我在 Order.java 中有一个 私有(private)类 MyClickHandler
。我希望 Customer.java 能够使用 MyClickHandler
,但我不想将 private class MyClickHandler
的确切代码复制到 B.java。
但是,问题是MyClickHandler
还使用了Order.java中的一些方法。幸运的是,这些方法也需要在 Customer.java 中使用。
订单.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
最佳答案
如果不确切知道这应该做什么,就很难完全清理设计,但作为开始,我会做这样的事情:
- 将所有类设为
public
- 提取常见行为
Order
和Customer
进入父类(super class)(下面名为Parent
- 不好) 名字!) - 只需在 for 中实例化
MyClickHandler
的实例即可 例如,Order
,并将对this
的引用传递给它,以便您可以 以与私有(private)方法相同的方式调用它的方法 类。
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 中实现相同的方法,即概念上属于这些类的常见行为,因此作为通用实现是有意义的父类(super class)中的行为
组合 - 正如您想要在两个地方使用的 ClickHandler 实现一样 - 这是一个概念上完全独立的逻辑模块,应该将其拉出到自己的类中并直接使用其他两个。
关于java - A.java中有一个私有(private)类 "P"(("P"使用了A.java中的一些方法),B.java如何访问 "P"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22028760/