2017-02-19 128 views
1

比方說,我有一個叫做book的類,它是抽象的,具有私有變量價格,並且它的getter方法也是抽象類。從抽象類訪問私有變量,訪問方法爲抽象

public abstract class Book{ 

private double price; 

public abstract double getPrice(); 

}//Ends book class 

現在我們假設我有一個使用的Book類,它繼承了Book的所有屬性,但也有一個與它關聯的年齡。另外我希望這個類從它的父類中覆蓋getPrice方法。這是我卡住的地方,因爲價格變量是私人的,父類有一個抽象的getter方法。

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

} 

謝謝

+0

你可以做自己和整個JDK一個贊成改變**私人雙重價格; **改爲**受保護的雙重價格; **如果您不希望向該變量提供公共訪問權限,但由於UsedBook旨在擴展Book,您最好將訪問修改符從私人保護。這將確保繼承規則保持不變 – ShayHaned

+0

因此,如上所述,用戶無法獲得價格權限?我要麼必須將變量價格更改爲受保護的值,要麼使書中的訪問器不是抽象的。正確?我很感激大家的迅速反應。 – Kevag6

+1

根本問題是,如果'price'是抽象超類,那麼'getPrice()'***不能在該類中抽象化。它必須具體並實現getter函數,因爲這是定義數據元素的地方。 'getPrice()'是抽象的。 –

回答

2

如果Book所有的實現都必須實現getPrice(),且實現總是隻返回的價格,它不應該是抽象的。你應該只定義吸氣您抽象類中:

public abstract class Book{ 

    private double price; 

    public double getPrice() { 
     return price; 
    } 

}//Ends book class 

如果這也不行,你需要直接繼承類訪問price變量,那麼你應該改變它是protected而不是private

+3

您仍然可以使用此建議覆蓋'getPrice'方法,並通過調用'super.getPrice()'獲取覆蓋內的'price'值。許多人認爲這是最佳做法,而不是使變量「受保護」。你應該拒絕讓字段非'私人'。 –

+0

@LewBloch好點。我可以肯定地看到,在某些情況下,這將如何導致更清潔的設計。 – nhouser9

1

馬克的價格爲受保護的,那麼你可以從子類訪問它:

public abstract class Book{ 

    protected double price; 

    public abstract double getPrice(); 

} 

public class UsedBook extends Book{ 

... 

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

.. 

} 
1

如果你不想price字段變量是從摘要公開訪問類,那麼,你應該改變訪問修飾符從privateprotected

保護訪問修飾符意味着該字段不能通過實例對象公開訪問。然而,任何繼承摘要類別的子類直接間接已將protected字段繼承爲字段變量,並且應用相同的規則,它不能公開訪問。

所以要包好,在類:

public abstract class Book { 
    protected double price; 

    public abstract double getPrice(); 
} 

繼承的書子類類:

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