Ситуация выглядит так:
class A;/*класс А. Он вызывает нужный МЕТОД*/
clas B:A;/*имеет некоторый enviroment, параметры которого нужно передать в МЕТОД, но класс А,
не знает о том что есть enviroment, а класс B не должен знать что есть вызов такого МЕТОДЕ*/
clas C:A;/*Всякие разные другие классы. У них свой инвиромент, но знать о МЕТОДЕ они не должны*/
clas D:A;
......
clas Z:A;
Каким паттерном лечится?
лечится перепроектированием иерархии классов
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, loknalori, Вы писали:
Абстрактной средой. Если такой нет, вопрос — действительно ли нужно эти классы наследовать от одного... Хотя по твоему описанию можно сказать ничего.
Здравствуйте, ZevS, Вы писали:
ZS>Здравствуйте, loknalori, Вы писали:
ZS>Абстрактной средой. Если такой нет, вопрос — действительно ли нужно эти классы наследовать от одного... Хотя по твоему описанию можно сказать ничего.
"Абстрактной средой" — а что это за паттерн такой??? Гугл о нем не знает.
Проблема в том что ни чего четко и сам сказать не могу. Код не мой, монстрозный и я первый раз его вижу. Соответственно перепроектировать иерархию сейчас нельзя — дров наломаю, а совсем кривое решение делать не хочется...
Здравствуйте, loknalori, Вы писали:
L>class A;/*класс А. Он вызывает нужный МЕТОД*/
Вызывает чей-то метод или предоставляет свой? В любом случае метод (а точнее обращение к его магической и волнующей реализации) оформить интерфейсом.
public interface IA<P> {
void method(P parameter);
}
public class A implements IA<String> {
public void method(String parameter) {
// implementation
}
public void _method() {
// outside IA code
}
}
И все обращения к методу производить не через реализацию, а интерфейс, то есть так:
IA a = new A();
//...
a.method("fire");
И ни в коем разе не так:
A a = new A();
//...
a.method("fire");
a._method("fire past by!!!");
Потому что открывается весь тип класса A, в то время как нам нужно давать клиентам только возможность вызова магического и волнующего метода, то есть интерфейс IA.
L>clas B:A;/*имеет некоторый enviroment, параметры которого нужно передать в МЕТОД, но класс А,
L>не знает о том что есть enviroment, а класс B не должен знать что есть вызов такого МЕТОДЕ*/
Попробовать наследование заменить делегированием. Это не паттерн, просто альтернативный по отношению к наследованию (полиморфизму) метод повторного использования кода.
public class B {
private final IA<String> a;
// по той же причине вовсе не так!
// private final A a;
private String ownParameter;
public B(IA<String> _a) {
a = _a;
}
public void fireCallMethod() {
a.method(ownParameter);
}
}
L>clas C:A;/*Всякие разные другие классы. У них свой инвиромент, но знать о МЕТОДЕ они не должны*/
L>clas D:A;
L>......
L>clas Z:A;
Переписать делегирование как-то так:
public abstract ADelegate<P> {
private final IA<P> a;
private P parameter;
public ADelegate(IA<P> _a) {
a = _a;
}
public abstract void fireCallMethod();
}
Классы B, C, D, ..., Z наследуют ADelegate:
public class B extends ADelegate<String> {
public B(IA<String> a) {
super(a);
}
@Override
public void fireCallMethod() {
// some magical actions on parameter
a.method(ownParameter);
}
}
public class C extends ADelegate<Integer> {
public B(IA<Integer> a) {
super(a);
}
@Override
public void fireCallMethod() {
// some magical actions on parameter
a.method(ownParameter);
}
}
L>Каким паттерном лечится?
Очень непонятно, что вы имеете в виду под "но знать о методе они не должны". Надеюсь, угадал чаяния.