java - 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 实例,但我想利用多态性来无缝更改类型,而无需编写更严格的代码代码。
解决方案
创建一个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
,或者您可以对客户进行年龄检查,因为无论如何您都可以免费获得该信息。
推荐阅读
- bash - 有没有办法知道bash中串口发送/接收的字节数?
- jpa - 以枚举为键、对象列表为值的持久化映射
- schema.org - 将 schema.org (JSON-LD) 产品对象添加到电子商务网站的集合页面?
- c# - 无法从 docker windows 容器中的 asp.net 核心应用程序连接到主机数据库
- django - Django 拿走其他用户的东西
- python - nn.CrossEntropyLoss() 函数导致 torch.FloatTensor has no 'requires_gradient' 属性错误
- c# - 如何使用 CSOM 模型获取 SharePoint 服务器日期时间?
- python - 如何在 HTML 文件中捕获 JSON 数据并动态填充下拉列表?
- python - VS Code - Python 终端中的波兰语符号问题
- sql - 需要以下格式的 SQL 结果集