По сути, вам нужно передать самого родителя или родительский тип в конструктор B. Приведенный ниже пример иллюстрирует последний случай.
class A {
B b;
A() {
b = new B(getClass());
}
}
class B {
Class<?> parentClass;
B(Class<?> parentClass) {
this.parentClass = parentClass;
}
void createParent() throws Exception {
Object o = parentClass.newInstance();
}
}
С дженериками вы можете сделать его более безопасным. Но поскольку функциональные требования не совсем ясны, я оставил это в покое.
Обновление Согласно вашему обновлению, создание экземпляров не имеет смысла. Вы можете просто проверить тип класса и обработать его соответственно. Вместо createParent()
в приведенном выше примере выполните:
void exit() {
if (parentClass == UserX.class) {
// Terminate program.
} else if (parentClass == UserY.class) {
// Logoff user.
}
}
Это, однако, безобразно. Вы действительно не можете добавить другой метод к интерфейсу User
? В противном случае следующий вариант будет лучше (так называемый шаблон стратегии ):
interface User {
void exit();
}
class ExitController {
void exit(User user) {
user.exit();
}
}
class UserX implements User {
public void exit() {
// Terminate program.
}
}
class UserY implements User {
public void exit() {
// Logoff user.
}
}
Согласно вашему последнему утверждению:
Кроме того, передача родительского объекта / имени класса кажется очень дорогой по сравнению с использованием, которое он предлагает
Это не имеет смысла. Вы измерили это? Покажите нам результаты.