2017-02-19 4 views
1

Lassen Sie uns sagen, ich habe eine Klasse namens Buch, das abstrakt ist, hat einen privaten variablen Preis und hat auch seine Getter-Methode als abstrakt.Access private Variable von abstrakten Klasse mit Zugriffsmethode als abstrakte

public abstract class Book{ 

private double price; 

public abstract double getPrice(); 

}//Ends book class 

Lassen Sie uns jetzt sagen, ich habe ein gebrauchtes Buch-Klasse, die alle Buches Attribute erbt, hat aber auch ein Alter mit ihm verbunden ist. Außerdem möchte ich, dass diese Klasse die getPrice-Methode von ihrer übergeordneten Klasse überschreibt. Hier stehe ich fest, da die Preisvariable privat ist und die Elternklasse eine abstrakte Getter-Methode hat.

public class UsedBook extends Book{ 

private int age; 

//constructor 
public UsedBook(){ 
age = 1; 
} 

@Override 
public double getPrice(){ 
//How can I implement this method so as a user I can access the price? 
} 

} 

Danke

+0

Sie selbst tun können und die ganze jdk einen Gefallen Ändern ** privater doppelter Preis; ** bis ** geschützter doppelter Preis; ** Wenn Sie NICHT daran interessiert sind, öffentlichen Zugriff auf diese Variable zu gewähren, aber da UsedBook Buch erweitern soll, ändern Sie besser Ihren Zugriffsmodifizierer privat zu geschützt. Dies stellt sicher, dass die Regeln der Vererbung intakt bleiben. – ShayHaned

+0

So würde es keinen Weg geben, wie ein Benutzer Zugang zum Preis wie oben erklärt bekommen? Ich müsste entweder den variablen Preis in "geschützt" ändern oder den Accessor im Buch nicht abstrakt machen. Richtig? Ich schätze alle schnellen Antworten. – Kevag6

+1

Das grundlegende Problem ist, dass, wenn "Preis" in der abstrakten Oberklasse ist, "getPrice()" in dieser Klasse nicht abstrakt sein kann. Es muss konkret sein und die Getter-Funktion implementieren, da dort das Datenelement definiert ist. Es macht null Sinn, dass "getPrice()" abstrakt ist. –

Antwort

2

Wenn alle Implementierungen von BookgetPrice() implementieren müssen, und die Umsetzung ist immer nur den Preis zurück, sollte es nicht abstrakt sein. Sie sollten nur den Getter innerhalb Ihrer abstrakten Klasse definieren:

public abstract class Book{ 

    private double price; 

    public double getPrice() { 
     return price; 
    } 

}//Ends book class 

Wenn dies nicht funktioniert, und Sie müssen direkt die price Variable erben Klassen zugreifen zu können, dann sollten Sie es ändern protected statt private zu sein.

+3

Sie können die 'getPrice'-Methode mit diesem Hinweis noch überschreiben und den' price' -Wert innerhalb der Überschreibung durch Aufrufen von 'super.getPrice()' ermitteln. Viele halten dies für eine bewährte Methode, anstatt die Variable "geschützt" zu machen. Sie sollten sich weigern, Felder nicht -privat zu machen. –

+0

@LewBloch Guter Punkt. Ich kann definitiv sehen, wie das in einigen Fällen zu einem saubereren Design führen würde. – nhouser9

1

Mark Preis als geschützt dann Sie es aus Unterklassen zugreifen können:

public abstract class Book{ 

    protected double price; 

    public abstract double getPrice(); 

} 

public class UsedBook extends Book{ 

... 

    @Override 
    public double getPrice(){ 
     return price; 
    } 

.. 

} 
1

Wenn Sie die price Feldvariable öffentlich zugänglich von der Abstrakt Klasse dann werden Sie nicht wollen, sollten Sie ändern die Zugriffsmodifikator von private bis protected.

geschützt Zugriffsmodifikator bedeutet, dass das Feld über Instanzobjekt nicht öffentlich zugänglich ist. Jedoch kann jede Unterklasse, die die Zusammenfassung Klasse direkt oder indirekt hat die protected Felder geerbt als Feldvariablen erbt, und die gleichen Regeln gelten geht, kann sie nicht öffentlich zugänglich sein.

Also, um es eingewickelt, die Buch Klasse:

public abstract class Book { 
    protected double price; 

    public abstract double getPrice(); 
} 

Die Unterklasse, die die Buch Klasse erbt:

public class UsedBook extends Book{ 

    private int age; 

    public UsedBook(){ 
    this.age = 1; 
    this.price = 0; // You should also set the field variable from the abstract "Book" class 
    } 

    @Override 
    public double getPrice(){ 
    return this.price; 
    } 
} 
Verwandte Themen