2017-02-19 7 views
1

私は、抽象クラスでプライベート変数を持ち、抽象クラスとしてゲッターメソッドを持つbookというクラスを持っているとしましょう。アクセスメソッドを持つ抽象クラスからのプライベート変数への抽象的アクセス

public abstract class Book{ 

private double price; 

public abstract double getPrice(); 

}//Ends book class 

ここで、ブックのすべての属性を継承するが、関連付けられているブッククラスがあるとしましょう。また、私はこのクラスが親クラスからgetPriceメソッドをオーバーライドしたい。これは、price変数がプライベートで、親クラスに抽象ゲッターメソッドがあるので、私が立ち往生する場所です。

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

} 

Bookのすべての実装がgetPrice()を実装する必要があり、実装は価格だけを返すように常にある場合、それは抽象的ではありませんあなたに

+0

あなたは自分自身と全体JDKおかげで行うことができます**プライベートダブルプライスを変更する** ** **保護されたダブルプライス** **この変数へのパブリックアクセスを提供することに興味がない場合、しかしUsedBookはBookを拡張することを意図しているので、保護されています。これにより、継承のルールがそのまま残ることが保証されます – ShayHaned

+0

上記の説明に従って、ユーザーが価格にアクセスする方法はありませんか?私は、保護された変数の価格を変更するか、抽象的なではないブックのアクセサーを作る必要があります。正しい?皆様の迅速な対応に感謝します。 – Kevag6

+1

根本的な問題は、 'price'が抽象スーパークラスにある場合、' getPrice() '***はそのクラスの抽象クラスではありません。それは、データ要素が定義されているので、具体的にgetter関数を実装する必要があります。これは、 'getPrice()'が抽象であることをゼロにします。 –

答えて

2

ありがとうございます。あなたは自分の抽象クラス内のゲッターを定義する必要があります

public abstract class Book{ 

    private double price; 

    public double getPrice() { 
     return price; 
    } 

}//Ends book class 

これが動作しない、とあなたが直接クラスを継承price変数にアクセスする必要がある場合は、あなたがprotectedの代わりprivateようにそれを変更する必要があります。あなたは、サブクラスからそれにアクセスすることができ、その後、保護として

+3

このアドバイスを使って 'getPrice'メソッドをオーバーライドし、' super.getPrice() 'を呼び出すことでオーバーライド内の' price'値を得ることができます。多くの人は、変数を 'protected'にするのではなく、これをベストプラクティスと考えています。あなたはフィールドを非公開にすることに抵抗すべきです。 –

+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フィールド変数は、その後抽象クラスから公的にアクセスできるようにしたくない場合は、変更する必要がありますアクセス修飾子はprivateからprotectedまでです。

protectedアクセス修飾子は、フィールドがインスタンスオブジェクトを介してパブリックにアクセスできないことを意味します。しかしが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; 
    } 
} 
関連する問題