Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于对象实例的类型转换的正确方法_Java_Oop - Fatal编程技术网

Java 基于对象实例的类型转换的正确方法

Java 基于对象实例的类型转换的正确方法,java,oop,Java,Oop,我有一个非常基本的问题,更像是一个设计问题。下面列出的类中,User是一个抽象类。只有PremiumUser和AdminUser可以发布消息,而GuestUser不能发布消息(因此GuestUser类中没有postedMessages;属性) 问题: 我有一个主类,从中我调用postMessage();方法,但在调用此方法之前,我使用另一个方法(其返回类型为User)获取User对象。因此,要调用postMessage()方法,我必须将User对象类型转换为AdminUser或PremiumU

我有一个非常基本的问题,更像是一个设计问题。下面列出的类中,User是一个抽象类。只有PremiumUserAdminUser可以发布消息,而GuestUser不能发布消息(因此GuestUser类中没有postedMessages;属性)

问题: 我有一个主类,从中我调用postMessage();方法,但在调用此方法之前,我使用另一个方法(其返回类型为User)获取User对象。因此,要调用postMessage()方法,我必须将User对象类型转换为AdminUserPremiumUser对象。我认为有三种方法可以做到这一点:

  • User类中使用属性userType进行if-else比较并基于该属性进行类型转换
  • 使用java反射获取对象的方法列表并调用postMessage方法
  • 考虑使用接口:我考虑使用将由AdminUserPremiumUser类实现的接口。即使在这种情况下,我也无法将类型为User的对象类型强制转换到类型接口中,并无缝地使用它来调用postMessage()
    我想知道我的设计在某些方面是否有缺陷,或者这是一个常见的问题,有一个更智能的解决方案来解决这个问题。

    为了安全铸造,您基本上使用了如下内容:

    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”条件而不是两个