好的,我在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
答案 0 :(得分:1)
如果不确切知道应该做什么,很难完全清理设计,但作为一个开始,我会做这样的事情:
public
Order
和Customer
进入超类(下面名为Parent
- 不好
名字!)MyClickHandler
的实例即可
例如,Order
,并将this
的引用传递给它,以便您可以
以与私有方式相同的方式调用方法
类。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的新实例,也可以返回已存在的实例。
我不建议这样做,我觉得受封装保护的类会是一个更好的解决方案。