2012-04-12 3 views
0

Ich habe eine abstrakte Klasse, die von einer anderen Concrete-Klasse abgeleitet ist. In meiner abstrakten Klasse habe ich eine Eigenschaft, die in der Methode derselben abstrakten Klasse aufgerufen wird. Diese Eigenschaft ist in der Klasse "Abstract" leer, aber in derived gibt sie einen Wert an. Wenn der Compiler die Methode startet, nimmt er trotzdem die Variable der abstrakten Klasse, und nicht, dass ich diese Methode für ein Objekt der abgeleiteten Klasse starte. Wie bekomme ich die tatsächliche URL var statt null?Java überschreiben geerbte Zeichenfolge

abstract public class AbstractHTTPFactory { 
    protected String URL = null; 

    final public ArrayList<? extends LGCookObject> make() throws HTTPFactoryException{ 
     try { 
      String response = sr.getData(URL); 
      } 
    } 
} 

public class RecipesHTTPFactory extends AbstractHTTPFactory{ 
    protected String URL = "VALUE"; 
} 
+0

Was ist srgetData()? –

+0

Wie rufen Sie die Eigenschaft? – pcalcao

+0

Sie können sich http://stackoverflow.com/questions/685300/is-there-a-way-to-override-class-variables-in-java –

Antwort

4

Felder sind nicht polymorph. Wenn Sie polymorphe Verhalten wollen, müssen Sie Methoden:

public abstract class AbstractHTTPFactory { 
    public final ArrayList<? extends LGCookObject> make() 
      throws HTTPFactoryException { 
     String response = sr.getData(getURL()); 
     ... 
    } 

    protected abstract String getURL(); 
} 

public class RecipesHTTPFactory extends AbstractHTTPFactory { 
    protected String getURL() { 
     return "VALUE"; 
    } 
} 

Oder möglicherweise könnten Sie ein Feld in AbstractHTTPFactory haben, die an den Konstruktor geliefert:

public abstract class AbstractHTTPFactory { 
    private final String url; 

    public final ArrayList<? extends LGCookObject> make() 
      throws HTTPFactoryException { 
     String response = sr.getData(url); 
     ... 
    } 

    protected AbstractHTTPFactory(String url) { 
     this.url = url; 
    } 
} 

public class RecipesHTTPFactory extends AbstractHTTPFactory { 
    public RecipesHTTPFactory() { 
     super("VALUE"); 
    } 
} 
0

Wenn Sie wirklich behalten wollen Wenn Sie die URL-Definition in Ihrer abstrakten Basisklasse verwenden, legen Sie ihren Wert in der abgeleiteten konkreten Klasse fest, statt eine Variable mit demselben Namen neu zu definieren, die die Basisklasse eins ausblendet. Es ist jedoch keine gute Übung, da mysteriöse Variablen in abgeleiteten Klassen erscheinen.