Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Распознания класса объекта, Вопрос по синтаксису 
:(
    Опции темы
Tomcat
Дата 23.5.2003, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2003
Где: Гродно, Беларусь

Репутация: нет
Всего: 2



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

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

Но мне это особо не нравиться. Можно ли реализовать это каким-либо другим способом, и если можно то как?
PM MAIL   Вверх
Sun
Дата 23.5.2003, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: 8
Всего: 48



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


--------------------
Account removed
PM MAIL   Вверх
Sun
Дата 23.5.2003, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Account removed
***


Профиль
Группа: Экс. модератор
Сообщений: 1611
Регистрация: 14.8.2002

Репутация: 8
Всего: 48



Код

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. При такой реализации, тебе придеться использовать вместо стандартных классов твои собственные

Это сообщение отредактировал(а) Sun - 23.5.2003, 16:52


--------------------
Account removed
PM MAIL   Вверх
SVK
Дата 23.5.2003, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 22.5.2003

Репутация: нет
Всего: 1



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

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

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

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

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

PM MAIL   Вверх
DarkDS
Дата 23.5.2003, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

Репутация: 11
Всего: 16



Потому что при передавании параметра не приводится из объекта к данному параметру. то есть если попробовать передать все это как f(obj ) - будет ошибка компиляции, так как нет процедуры с обектом в качестве параметра...
PM MAIL   Вверх
Tomcat
Дата 24.5.2003, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 4.4.2003
Где: Гродно, Беларусь

Репутация: нет
Всего: 2



Спасибо, народ! Честно признаюсь, сглупил. Даже мысли не пришло полиморфизм использовать. Но теперь все нормально.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.