正如标题所说,我正在尝试做这样的事情:
public abstract class ClassA{
private String var;
...
protected void setVar(String var){
this.var = var
};
protected String getVar(){
return this.var
};
}
public class ClassB extends ClassA{
public ClassB(...){
object.setListener(new Listener(){
@Override
public void onItemSelected(data ...){
// Would like to do:
var = data;
// BUT:
// CANT CALL VAR since its a private String of Class A
// CANT CALL setVar(data) since it will end up looping
// CANT CALL super.setVar(data) since super dosn't point to ClassA in here
};
});
}
@Override
protected void setVar(String var){
super.setVar(var);
// DO MORE STUFF WHICH WILL CALL THE LISTENER
};
}
当然,我可以公开var,但那不是我想要的! var应保持受保护,只应使用setter进行更改。
有办法吗?
答案 0 :(得分:1)
试试这个:
object.setListener(new Listener(){
public void onItemSelected(data ...){
ClassB.this.var = data;
}});
答案 1 :(得分:-1)
有点费解,但是:
class Listener {
public void onItemSelected(String data){ }
}
class ClassC {
public void setListener(Listener listen) {
listen.onItemSelected("Do something");
}
}
abstract class ClassB{
protected String var;
protected void setVar(String var){
this.var = var;
};
protected String getVar(){
return this.var;
};
public void printVar() {
System.out.println("This is 'var': " + this.var);
}
}
public class ClassA extends ClassB{
public static void main(String[] argv) {
ClassA me = new ClassA("Do something else");
}
public ClassA(String x){
ClassC object = new ClassC();
object.setListener(new Listener(){
@Override
public void onItemSelected(String data){
// Would like to do:
var = data;
// BUT:
// CANT CALL VAR since its a protected String of Class A
// CANT CALL setVar(data) since it will end up looping
// CANT CALL super.setVar(data) since super dosn't point to ClassA in here
};
});
this.printVar();
}
@Override
protected void setVar(String var){
super.setVar(var);
// DO MORE STUFF WHICH WILL CALL THE LISTENER
};
}
结果:
C:\JavaTools>javac ClassA.java
C:\JavaTools>java ClassA
This is 'var': Do something
C:\JavaTools>