【发布时间】:2017-05-03 12:31:50
【问题描述】:
我有一个关于如何在通过接口实例化时调用对象基成员的问题。
假设我正在尝试构建的框架中有以下接口和具体类:
public interface UsedClass {
public boolean getBool();
}
public class User implements UsedClass {
private String userName;
private String userRole;
public User(String userName, String userRole){
this.userName = userName;
this.userRole = userRole;
}
public boolean getBool() {
// some code
}
public int getUserName() {
return userName;
}
public int getUserRole() {
return userRole;
}
还有一个实现类:
public class Run implements UsedClass {
private String runName;
private int runNumber;
public Run(String runName, int runNumber){
this.runName = runName;
this.runNumber = runNumber;
}
public boolean getBool() {
// some code
}
public String getRunName() {
return runName;
}
public int getRunNumber() {
return runNumber;
}
}
但我不能将方法getRunName() 或getUserRole() 放入接口!
最终目标是创建一个 FactoryClass 来处理从数据库 GUI 传递的对象。
我想知道是否有更好的方法,然后使用类引用能够安全地调用 Run 或 User 的方法,例如:
public class EntityFactory {
public static Object getValueAt(int rowIndex, int columnIndex, UsedClass usedClass) {
if (usedClass.getClass().getSimpleName().equals("User")) {
switch (columnIndex) {
case 0:
return ((User) usedClass).getUserName();
case 1:
return ((User) usedClass).getUserRole();
default:
return null;
}
} else if (usedClass.getClass().getSimpleName().equals("Run")) {
switch (columnIndex) {
case 0:
return ((Run) usedClass).getRunName();
case 1:
return ((Run) usedClass).getRunNumber();
default:
return null;
}
}
我已经阅读了几篇 SO 帖子 type casting when objects are of interface references in Java 和 Java cast interface to class
暗示不建议引用转换,但由于我不能将所有方法都放入接口中,建议什么?
【问题讨论】:
-
至少使用
usedClass instanceof User而不是usedClass.getClass().getSimpleName().equals("User")。 -
也许您可以在接口中添加一些
getValueAt(int columnIndex)方法并在子类中实现它? -
杰斯珀:谢谢。 Berger:但是在单个类中拥有这个 getValueAt 更加面向对象。至少我是这么认为的。
-
不要使用字符串来识别这样的类。你失去了所有类型的安全性。这不是面向对象的编程。你的类型系统是错误的。您需要一个接口,允许客户端类使用它而无需向下转换或任何
instanceof垃圾。 -
如果不了解您为什么这样做的更多细节,就没有正面的例子。但是@LewBloch 是正确的,这不是做事的好方法。