Суперкласс не должен даже знать о существовании подкласса, тем более выполнять операции, основываясь на полностью определенном имени подкласса.Если вам нужны операции, основанные на точном классе, и вы не можете выполнять необходимую функцию путем наследования, вы должны сделать что-то вроде этого:
public class MyClassUtil
{
public static String doWorkBasedOnClass(Class<?> clazz)
{
if(clazz == MyNormalClass.class)
{
// Stuff with MyNormalClass
// Will not work for subclasses of MyNormalClass
}
if(isSubclassOf(clazz, MyNormalSuperclass.class))
{
// Stuff with MyNormalSuperclass or any subclasses
}
// Similar code for interface implementations
}
private static boolean isSubclassOf(Class<?> subclass, Class<?> superclass)
{
if(subclass == superclass || superclass == Object.class) return true;
while(subclass != superclass && subclass != Object.class)
{
subclass = subclass.getSuperclass();
}
return false;
}
}
(непроверенный код)
Этот класс также не знает о своих собственных подклассах, а использует класс Class
для выполнения операций.Скорее всего, он все еще будет тесно связан с реализациями (как правило, это плохо, или, если не плохо, это не особенно хорошо ), но я думаю, что такая структура лучше, чем суперкласс, выясняющий, чтоего подклассы.