2014-06-24 99 views
0

不知道的标题声明的对象本身,但这里有云:使用反射

我有打算一个类来进行扩展,如:

public class A{ 

    public void methodThatDoesStuff(){ 
     //Uses AA here 
    } 

    protected class AA{ 
     //does most of the stuff here 
    } 
} 

public class B extends A{ 
    public class BB extends AA{ 
    } 
} 

正如你所看到的。 methodThatDoesStuff使用AA,但是当B被调用时,我希望它使用BB来代替。

原因是AA具有一些变量,这些变量对所有类都是通用的。但有些不同。 innerClasses是具有@Expose变量,setter和getter的JSONObjects。

如何在超类中指定要使用的类?

+4

这感觉就像一个[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你真的想做什么?定义一个'AA'接口,并在'A'中放入一个需要它的单独的arg构造函数? –

+0

你说得对,我会改变这个问题 –

+0

究竟是什么取代'在这里使用AA'? – sp00m

回答

0

你不能指定在超类中使用哪个类,导致超类没有类的信息,它从它继承。在超类中定义类型为AA的变量,并使用构造函数或设置器在运行时设置适当的实例。演示:

public class A { 
    protected AA serviceVar; 

    public A() { 
     this.serviceVar = new AA(); 
    } 

    public void methodThatDoesStuff() { 
     System.out.println(serviceVar); 
    } 

    protected class AA { 
     protected String message; 

     public AA() { 
      message = "AA"; 
     } 

     public String toString() { 
      return message; 
     } 
    } 
} 

public class B extends A { 
    public B() { 
     this.serviceVar = new BB(); 
    } 

    public class BB extends AA { 
     public BB() { 
      this.message = "BB"; 
     } 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     A a = new A(); 
     A b = new B(); 
     a.methodThatDoesStuff(); 
     b.methodThatDoesStuff(); 
    } 
} 

正如你可以看到,当实例A,取决于AAmethodThatDoesStuff打印出消息,当实例B它使用BB而不是方法。您使用serviceVar,您需要分别从AA或其某些子类获得功能。这意味着在你的情况下,你在methodThatDoesStuff中使用这个变量。

+0

我不确定是否有足够的信息来确定地回答这个问题,因为提问者没有充分指定他实际需要的内容。至少要在阐述诸如“你不能在超类中指定”之类的问题之前,先解释你认为他想要的东西,这可能不是真的,这取决于问题的解释方式。 –

+0

当你说“你不能在超类中指定”时,你指的是什么“那个”? –

+0

我认为这足够清楚他到底想要什么。他在方法methodThatDoesStuff中使用AA的功能,但他希望用BB代替子类实例B的AA行为。由于没有静态继承,因此您需要有一个变量来执行此操作,这是一种解决这个问题。 –

0

一个常见的方法是定义一个创建AA对象的函数,该类可以覆盖哪个子类。这允许子类创建AA的子类的对象(如果需要的话)。

public class A{ 

    public void methodThatDoesStuff(){ 
     AA aa = getAA(); 
     // use aa 
    } 

    protected class AA{ 
     //does most of the stuff here 
    } 

    // Function to create AA instances. Subclasses 
    // can override this. 
    protected AA getAA() { 
     return new AA(); 
    } 
} 

public class B extends A{ 
    public class BB extends AA{ 
    } 

    @Override 
    protected AA getAA() { 
     return new BB(); 
    } 
}