关于抽象类和继承的问题

时间:2011-05-10 13:25:45

标签: java inheritance

我有一个名为Customer的抽象类,它在所有客户(ex id,name,surname)之间共享一些属性。

然后我有几个类PriorityCustomers,它们有特殊的唯一字段,如(高度,宽度),MidPriorityCustomers等。

当我这样做时:

Customer customer = new PriorityCustomer();

我无法访问优先客户方法。当我以其他方式尝试它时,我无法实例化抽象类。

我正在使用这个,因为我想通过相同的流程处理所有客户,只有那些有特殊需求的客户才会为他们做些特别的事情。

因此我的方法返回Customer类型。我在这里做出错误的决定吗?任何人都能提出建议吗?

忘记提及

我在父抽象类中的字段我没有特殊客户类中的字段,反之亦然。(在Customer类中没有高度,宽度,但那些在PriorityCustomers类中)

6 个答案:

答案 0 :(得分:4)

当你需要特定的方法时,它听起来就像你有一个超级处理方法。

abstract class Customer {
    public abstract returnType process(args);
}

class PriorityCustomer extends Customer {
    public returnType process(args) {
       // process PriorityCustomer 
    }
}

class MidPriorityCustomer extends Customer {
    public returnType process(args) {
       // process MidPriorityCustomer 
    }
}

然后您需要的只是

for(Customer customer: customers)
    customer.process(args);

这将允许您处理所有客户类型,其中每个客户类型都知道它需要什么特殊处理。

答案 1 :(得分:3)

您的参考是客户对象,因此只有客户上的方法可见。如果要调用PriorityCustomer上的方法,则需要生成PriorityCustomer类型的引用。如果您需要在PriorityCustomer上调用方法,则需要执行以下操作:

PriorityCustomer customer = new PriorityCustomer();

如果您需要PriorityCustomer的特定行为,请覆盖客户对象上的方法并使用您的代码:

 Customer customer = new PriorityCustomer();

因此,如果Customer有一个名为processOrder()的方法,您可以在PriorityCustomer中覆盖它。当多态性开始时,您可以在Customer引用上调用processOrder(),它将是PriorityCustomer上将被执行的方法。这就是为子类提供不同行为的方法,但只需在代码中使用超类引用。

答案 2 :(得分:1)

将变量声明为超类的优点是可以使用任何用于实例化此变量的子代。

缺点是你只限于声明的类的接口;您可以明确地将Customer转换为PriorityCustomer,但您应该使用instanceof来确保它是安全的:

Customer customer = new PriorityCustomer();
if (customer instanceof PriorityCustomer) {
    height = ((PriorityCustomer)customer).getHeight();
}

总而言之:您通常希望将变量声明为您需要使用的任何类。如果您发现自己进行了大量的显式转换,则可能需要重新考虑类结构。

答案 3 :(得分:0)

拥有一个通用基类的想法是将所有客户的通用功能分组到一个类中,并在其上构建特定类型的客户。如果您想要访问PriorityCustomer个特定属性,并且您确定自己拥有PriorityCustomer个实例,则可以进行投射。

float height = ((PriorityCustomer)customer).height;

答案 4 :(得分:0)

您可以使用instanceof来帮助解决这个问题

Customer customer = new PriorityCustomer();
if ( customer instanceof PriorityCustomer ) {
    ((PriorityCustomer)customer).somePriorityCustomerSpecificMethod();
}

显然这是一个人为的例子。

答案 5 :(得分:0)

public Customer getTheCustomer() {
    // return one of the subclasses of Customer
}
....


Customer c = getTheCustomer();
if (c instanceof PriorityCustomer) {
    PriorityCustomer pc = (PriorityCustomer) c;
    // do something with pc
} else if (c instanceof MidPriorityCustomer) {
    MidPriorityCustomer mpc = (MidPriorityCustomer) c;
    // do something with mpc

... et cetera ...