2015-10-25 46 views
0

我有一个非常基本的问题,它更像是一个设计问题。下面列出的是用户是抽象类的类。仅PremiumUserADMINUSER可以发布消息而guestuser的不能发布的消息(因此没有postedMessages;属性在guestuser的类)。根据对象实例类型转换的正确方法

enter image description here

问题: 我有从那里我调用的postMessage()主类;方法,但在调用此方法之前,我使用另一种方法(其返回类型为用户)获得对象的用户。所以,调用的postMessage()方法,我将不得不类型转换用户对象插入任一ADMINUSERPremiumUser对象。我看到三种方式来做到这一点:

  1. 使用属性USERTYPE用户类做的if-else比较和强制类型转换基于这一点。
  2. 使用java反射来获取对象的方法列表并调用postMessage方法。
  3. 考虑使用一个接口:我考虑使用一个接口,该接口将由AdminUserPremiumUser类实现。即使在这种情况下,我也无法将用户类型的对象转换为类型接口,并无缝地使用它来调用postMessage();

我在想,如果我的设计在某种程度上缺乏或者它是一个普遍的问题,有一个聪明的解决方案这一点。

+0

@RC。我已经考虑通过PremiumUser和AdminUser类实现一个接口。即使在这种情况下,我也无法将类型为User的对象转换为接口并无缝地使用它。 (我宁愿将其添加到问题本身中) – rsharma

+0

只需传递User对象,并检查调用方法中的错误。无论如何,您都无法声明一个方法,只要不包含GuestUser就可以接受PremiumUser和AdminUser。 –

回答

1

使用与postMessage方法的接口在它:

interface HasPostMessage { 
    boolean postMessage(String message); 
} 

PremiumUserAdminUser实现它。然后:

if (user instanceOf HasPostMessage) { 
    ((HasPostMessage) user).postMessage("The message"); 
} 
+0

好吧,所以基本上这样我将不得不使用一个“如果”条件而不是两个 – rsharma

+1

它也更“安全”(代码演变)恕我直言 –

1

为了安全投你基本上使用类似:

PremiumUser.class.isAssignableFrom(object); 

这也适用于从PremiumUser(例如)继承的对象。有多种选择可以避免这种检查,但这完全是设计问题。一些示例:

  • 在User类中声明postMessage()方法,并针对每种类型的用户实施不同的方法。
  • 实施组,角色和权利,并检查特定用户是否有权发布消息。
相关问题