从Java中的anon类访问继承的变量

时间:2012-01-18 19:51:35

标签: java android inheritance abstract extends

正如标题所说,我正在尝试做这样的事情:

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进行更改。

有办法吗?

2 个答案:

答案 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>