2014-01-18 59 views
0

继承让我们假设我有一个抽象类:从抽象类

public abstract class Customer { 
    private int price; 

    public void setPrice(int price) { 
    this.price = price; 
    } 

    public int getPrice() { 
    return price; 
    } 

    public abstract void pay(int n); 
    public abstract void occupySpace(); 

} 

我也有继承它两类:

  1. HandicappedCustomer,在这里我想设置的价格为0
  2. RegularCustomer,在这里我想将价格定为100

现在,如果我创建了这些类中的每个类的实例并调用getPrice(),则两者都返回0。当我为每个相应的课程实例调用getPrice()时,使其返回0和100的最简单方法是什么?

当我尝试在RegularCustomer类中调用setPrice(100)时,我发现它不起作用。说白了,我想在我的主下面的代码:

Customer a = new HandicappedCustomer(); 
Customer b = new RegularCustomer(); 
System.out.println(a.getPrice()); 
System.out.println(b.getPrice()); 

并使其返回:

+1

向我们展示您的代码,适用于所有课程和您的主要课程。 – MrSimpleMind

回答

4

如果你想getPrice总是返回100为常客和总是返回0为残障客户,你会写

class RegularCustomer extends Customer { 
    public int getPrice() { 
     return 100; 
    } 
} 

class HandicappedCustomer extends Customer { 
    public int getPrice() { 
     return 0; 
    } 
} 

但并不完全相同听起来像你想,因为你包括在您的设计setPrice(至少对于熟客)什么。听起来就像你想要这些值返回最初。在这种情况下:

class RegularCustomer extends Customer { 
    public RegularCustomer() { 
     setPrice(100); 
    } 
} 

class HandicappedCustomer extends Customer { 
    public HandicappedCustomer() { 
     setPrice(0); 
    } 
} 

应该做的伎俩。

如果您想稍后更改它们,它们都会继承setPrice,并且它们都将继承getPrice,所以一切都应按预期工作。

Live demo at ideone

+0

呃,这比我想象的要简单得多(现在感觉到白痴)。谢谢。我尝试在HandicappedCustomer类中调用setPrice,而不使用构造函数,该构造函数不起作用。 – user1413969

+0

注意我的第一个答案中有一个拼写错误,但我修正了它在ideone上添加了一个工作示例的链接。 (问题是,如果'price'被保护或者package-private,子类只能访问'this.price'。因为它是私有的,所以我们必须从构造函数中调用setter。)希望它有帮助。 –