我有一个名为Customer
的抽象类,它在所有客户(ex id,name,surname)之间共享一些属性。
然后我有几个类PriorityCustomers
,它们有特殊的唯一字段,如(高度,宽度),MidPriorityCustomers
等。
当我这样做时:
Customer customer = new PriorityCustomer();
我无法访问优先客户方法。当我以其他方式尝试它时,我无法实例化抽象类。
我正在使用这个,因为我想通过相同的流程处理所有客户,只有那些有特殊需求的客户才会为他们做些特别的事情。
因此我的方法返回Customer
类型。我在这里做出错误的决定吗?任何人都能提出建议吗?
忘记提及:
我在父抽象类中的字段我没有特殊客户类中的字段,反之亦然。(在Customer类中没有高度,宽度,但那些在PriorityCustomers类中)
答案 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 ...