2012-01-18 50 views
0

正如标题所说一个在继承变量,我试图做这样的事情:访问从匿名类在Java中

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

你为什么不能打电话SETVAR? – 2012-01-18 20:39:58

+0

,因为setVar会调用ClassB的setVar方法。如果你看看我在ClassB中的setVar中写的评论,你会发现确实会调用super.setVar,因此在ClassA中设置var,但从ClassB中设置setVar会执行一些操作,导致onItemSelected监听器被调用,然后调用setVar再次ClassB等等。你最终会循环。我唯一看到这个问题并保持var private的唯一机会是对ClassB中调用super.setVar的方法使用不同的方法名称。但这有点难看。 – masi 2012-01-19 11:31:47

回答

1

试试这个:

object.setListener(new Listener(){ 
public void onItemSelected(data ...){ 
    ClassB.this.var = data; 
}}); 
+0

谢谢你做到了!但是,你能解释一下这种做法吗?我的意思是,我怎么可能从这个类的匿名类访问ClassB的当前实例?它是否专门设计用于访问匿名课程? – masi 2012-01-18 20:10:15

+1

每当你试图从一个类中引用一个成员变量时,就会推断出this指针。 I.E. 'this.var'与'var'相同,但在这种情况下'var'不是'Listener'类的成员,而是一个封闭类'ClassB'。所以你必须指定你想用来做什么'this'指针,你首先给出类名。 – slayton 2012-01-18 21:05:31

+0

谢谢!说得通。我编辑了我的第一个问题,因为我有一个错误。我希望var是私有的,并且只能使用setter getters访问(请参阅编辑的代码示例)。现在这个技巧不再适用了。但是,自从在这个特殊情况下,我的ClassA不需要setVar的实现,我只是做了setter抽象并使var受到保护。使用适合的包装结构,我已经能够保护我不想访问var。但是如果我想让var变成私人的呢? – masi 2012-01-18 21:58:32

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