首页 > 解决方案 > Java中如何正确使用多态调用正确类的方法

问题描述

假设我有一个电影院注册系统。

而且我有一个父Customer类和一个子MinorCustomer类。

MinorCustomer有一个isAuthorized()方法,它在 Customer 中不存在,它返回 true 或 false,如果所选电影不适合无人陪伴的未成年人,则意味着调用

isAuthorized()现在,在实例化类以将信息存储在数据结构中(无论哪种方式)时,我遇到了在客户端是未成年人的情况下我无法调用的问题。

这都是假设的,所以没有包含此代码的程序,但假设情况是

Customer cust = new Customer()
if(cust.getAge() < 18) {
    cust = (MinorCustomer) cust;
    cust.isAuthorized();
}

但是,该代码将无效,因为它仍会被视为cust的实例Customer,而不是MinorCustomer。我知道我可以简单地使用 if 语句来确定是否要根据年龄创建一个新的 Customer/Minor 实例,但我想利用多态性来无缝更改类型,而无需编写更严格的代码代码。

标签: javaooppolymorphism

解决方案


创建一个CustomerFactory根据年龄参数为客户提供适当类型的客户。

依据的原则

class Customer { }
class MinorCustomer extends Customer { }

...那么您的工厂的实现可能是:

class CustomerFactory {
    public static Customer createInstance(final int age) {
        if(age < 18) {
            return new MinorCustomer();
        } else {
            return new Customer();
        }
    }
}

...然后可以像这样在您的代码中使用。

Customer cust = CustomerFactory.createInstance(17);

您可以强制instanceof检查要求Customer不是 a 的方法MinorCustomer,或者您可以对客户进行年龄检查,因为无论如何您都可以免费获得该信息。


推荐阅读