Java 基于对象实例的类型转换的正确方法
我有一个非常基本的问题,更像是一个设计问题。下面列出的类中,User是一个抽象类。只有PremiumUser和AdminUser可以发布消息,而GuestUser不能发布消息(因此GuestUser类中没有postedMessages;属性) 问题: 我有一个主类,从中我调用postMessage();方法,但在调用此方法之前,我使用另一个方法(其返回类型为User)获取User对象。因此,要调用postMessage()方法,我必须将User对象类型转换为AdminUser或PremiumUser对象。我认为有三种方法可以做到这一点:Java 基于对象实例的类型转换的正确方法,java,oop,Java,Oop,我有一个非常基本的问题,更像是一个设计问题。下面列出的类中,User是一个抽象类。只有PremiumUser和AdminUser可以发布消息,而GuestUser不能发布消息(因此GuestUser类中没有postedMessages;属性) 问题: 我有一个主类,从中我调用postMessage();方法,但在调用此方法之前,我使用另一个方法(其返回类型为User)获取User对象。因此,要调用postMessage()方法,我必须将User对象类型转换为AdminUser或PremiumU
我想知道我的设计在某些方面是否有缺陷,或者这是一个常见的问题,有一个更智能的解决方案来解决这个问题。为了安全铸造,您基本上使用了如下内容:
PremiumUser.class.isAssignableFrom(object);
这也适用于从PremiumUser继承的对象(例如)。有多种选择可以避免这种检查,但这完全是设计问题。一些例子:
- 在User类中声明postMessage()方法,并为每种类型的用户实现它
- 实现组、角色和权限,并检查特定用户是否有权发布消息
postMessage
方法的接口:
interface HasPostMessage {
boolean postMessage(String message);
}
使PremiumUser
和AdminUser
实现它。然后:
if (user instanceOf HasPostMessage) {
((HasPostMessage) user).postMessage("The message");
}
@RC。我已经考虑过通过PremiumUser和AdminUser类实现一个接口。即使在这种情况下,我也无法将User类型的对象类型强制转换到界面中并无缝地使用它。(我更愿意将此添加到问题本身)只需传递User对象,并检查被调用方法中的错误。你不能声明一个使用PremiumUser和AdminUser而不包含GuestUser的方法。好的,基本上这样我只能使用一个“if”条件而不是两个