Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Распознания класса объекта


Автор: Tomcat 23.5.2003, 08:35
Посоветуйте, кто чем может. Вопрос такой: имеется функция f(Object obj), которая делает всевозможные действия, взависисмости от того, какого класса является объект obj, т.е. если obj является строкой, то делать одно действие, если Boolean, то другое и т.д. Я реализовал это следующим образом:

if(obj instanceof String) procedure1();
else if(obj instanceof Boolean) procedure2();
else if(obj instanceof Integer) procedure3();
... аналогично с другими классами .....

Но мне это особо не нравиться. Можно ли реализовать это каким-либо другим способом, и если можно то как?

Автор: Sun 23.5.2003, 10:51
Вообще-то есть такая замечательная вещь как полиморфизм, который решает все эти проблемы. Для его реалзации тебе надо написать интерфейс, в котором объявить некоторый метод. Далее объявить классы которые будут реализовывать (implement) этот интерфейс и наследовать классы String, Boolean и т.д. Тогда в метод f(Object obj) ты будешь передавать не Object, а твой интерфейс, и в теле метода будешь вызывать метод интерфейса, а тот благодаря механизму полиморфизма будет вызывать методы твоих классов.

Автор: Sun 23.5.2003, 11:00
Код

public interface MyInterface {
 public void someMethod();
}

public class MyString extends String implements MyInterface {
 public void someMethod() {
   ...
 }
}

public class MyBoolean extends Boolean implements MyInterface {
 public void someMethod() {
   ...
 }
}

...

public void f(MyInterface m) {
 m.someMethod();
}


P.S. При такой реализации, тебе придеться использовать вместо стандартных классов твои собственные

Автор: SVK 23.5.2003, 18:15
Sorry - тупой вопрос, вероятно: а почему нельзя сделать просто набор методов с разными входными параметрами?

viod f (String s)
{ procedure1();
}

viod f (Boolean b)
{ procedure2();
}

viod f (Integer i)
{ procedure3();
}

... аналогично с другими классами .....

Автор: DarkDS 23.5.2003, 18:18
Потому что при передавании параметра не приводится из объекта к данному параметру. то есть если попробовать передать все это как f(obj ) - будет ошибка компиляции, так как нет процедуры с обектом в качестве параметра...

Автор: Tomcat 24.5.2003, 08:48
Спасибо, народ! Честно признаюсь, сглупил. Даже мысли не пришло полиморфизм использовать. Но теперь все нормально.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)