我有一个在一个类中创建的数据类,可以传递给实现特定接口的几个Android UI活动之一。
每个UI使用相同的数据,但并非所有UI都需要所有数据。我想知道是否有一个简单解决方案,允许每个UI只使用数据的特定部分(仅使用特定的访问者/获取者)
// ICalculatorAbstraction is what all my UI's implement. It has method... void updateResult(ExpressionState expression)
public final View.OnClickListener listenerOn(final ICalculatorAbstraction UI) {
return listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
// Calculations
ExpressionState expression = new ExpressionState.Builder()
.setFirstNumber(num1)
.setSecondNumber(num2)
.setTotal(total)
.setOperator(operator.getSign())
.build();
UI.updateResult(expression);
}
};
}
同样,我的所有Android活动(UI)都实现了这个界面
public interface ICalculatorAbstraction {
...
void updateResult(ExpressionState result);
}
@Override
public void updateResult(ExpressionState result) {
String results = String.format( // NOTE: this one needs ALL the accessors / getters!!
"%s %s %s = %s",
result.getFirstNumber(),
result.getOperator(),
result.getSecondNumber(),
result.getTotal()
);
this.txtResult.setText(results);
@Override
public void updateResult(ExpressionState result) {
String results = String.format( // NOTE: this one needs ONE accessor / getter!!
"Wow. Such Calcuation. %s",
result.getTotal()
// NOTE: These should not be allowed in this instance because this UI does not use them
// result.getFirstNumber()
// result.getOperator()
// result.getSecondNumber()
);
this.txtResult.setText(results);
如何更改updateResult(...)
(在界面和界面中),以便特定用户界面updateResult(...)
只允许我使用所需的评估者/获取者?
我尝试创建一个空白界面,然后创建了两个实现该空白界面的抽象类。抽象类只有我需要的访问器/ getter,但是当我尝试修改上面的代码时,没有任何效果。
这可能吗?
以下是我希望看到的内容 - "我最好的解决方案"你可以说。
@Override
public void updateResult(IAllAccessors result) {
String results = String.format(
"%s %s %s = %s",
result.getFirstNumber(),
result.getOperator(),
result.getSecondNumber(),
result.getTotal()
);
this.txtResult.setText(results);
@Override
public void updateResult(IOneAccessorOnly result) {
String results = String.format(
"Wow. Such Calcuation. %s",
result.getTotal() // I should not be able to do result.getFirstNumber(); for example
);
this.txtResult.setText(results);
public class ExpressionState implements IOneAccessorOnly, IAllAccessors {
private ExpressionState(Builder builder) { ... }
public double getFirstNumber() { ... } // IAllAccessors
public double getSecondNumber() { ... } // IAllAccessors
public String getOperator() { ... } // IAllAccessors
public double getTotal() { ... } // IAllAccessors, IOneAccessorOnly
public static class Builder { ... }
}
这个解决方案的问题在于,我无法弄清楚如何处理我上面的界面!我没有一个参数可以让编译器对两个UI感到满意。
在使用构建器
创建ClickListener
时,在我的ExpressionState
课程中
IOneAccessorOnly var = new ExperssionState.Builder()...
这是因为在我的ClickListener
课程中,我不知道要创建哪一个。它必须非常通用。在我的用户界面中,我想简化我可以使用的内容。我不能用这种方法做到这一点
因为它不知道该是什么,所以它必须是"一切"
ExpressionState var = new ExpressionState.Builder()...
除此之外,它真的不能是其他任何东西。解决方案必须专门处理UI(活动)以缩小允许的范围!!
答案 0 :(得分:1)
如果Expression状态是你自己的类,我会让它实现两个不同的接口,如此。
public class ExpressionState implements InterfaceOne, InterfaceTwo {
public void interfaceOneGetterMethod()
public void interfaceTwoGetterMethod()
}
在另一个档案中:
public interface InterfaceOne {
public void interfaceOneGetterMethod();
和最终文件:
public interface InterfaceTwo {
public void interfaceTwoGetterMethod();
现在,当您创建ExpressionState对象时,将它们分配给定义为的对象:
InterfaceTwo var = new ExperssionState(blah);
或者修改构建器以返回接口(甚至更好)