2017-02-19 160 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; 
    } 
}