![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: 2 Всего: 4 |
есть список объектов разных классов, поэтому в качестве класса указан Object
надо для каждого из них вызвать метод getName(), который есть в каждом классе но для этого надо указать класс ((...)object).getName() как можно его узнать? |
|||
|
||||
| yar |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 101 Регистрация: 8.9.2007 Где: Одесса, Украина Репутация: 1 Всего: 8 |
Класс объекта узнать можно с помощью рефлексии. Однако сделать так как ты хочешь нельзя - привести объект к неизвестному на этапе компиляции классу. Здесь можно поступить несколькими способами.
1. Реализовать в каждом классе некий интерфейс, имеющий необходимый метод. Затем приводить наши Object-ы к этому интерфейсу и вызывать метод... 2. Вызвать метод с помощью рефлексии
3. Или использовать "утиную типизацию" (если нет возможности реализовать в классах интерфейс); как её можно эмулировать в Java я описал вот тут. --------------------
Если бы строители возводили здания так, как программисты пишут программы, первый же дятел уничтожил бы мировую цивилизацию.Джеральд Вайнберг |
|||
|
||||
| ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: 2 Всего: 4 |
yar,
спасибо! Я реализовала так:
Это нормально? Как я понимаю, проще нельзя. |
|||
|
||||
| Ortega |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 5.11.2005 Где: Харьков, Украина Репутация: 4 Всего: 6 |
Это путь наименьшего сопротивления и его право на жизнь зависит от масштабов того, частью чего этот код является. В принципе, это неправильно, и вся моя ООП сущность против такого издевательства. Однако если речь идет о (относительно) небольшой программке, то можно и так. Товарищ yar предложил два отличных способа. Причем первый - предпочтительнее. Вам можетбыть лень так делать, однако поверьте мне - потом может быть значительно хуже --------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок |
||||
|
|||||
| alexadr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 25.9.2006 Репутация: 4 Всего: 4 |
Однозначно 1-ый вариант описанный yar
А вот это лучше не использовать даже в маленьких программках, т.к. часто они очень быстро разрастаются |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
Сделал бы именно так, но когда работаешь с другими системами, где реализовать интерфейс невозможно, и придется писать наследника, который наследуется от целевого класса и реализует класс Nameable, тоже туго. Приведенный поход не развалится, если его правильно реализовывать. Я вижу правильный подход такой:
т.е. такой черный ящичек. Когда нам надоест добавлять классы, мы сможем легко поменять на рефлексию. Это сообщение отредактировал(а) Platon - 18.8.2008, 11:29 |
|||
|
||||
| Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
Причем мы видим преимущество приведенного мной подхода, мало того, что код легко поддерживать, и нам неважно как он работает, плюс наш метод работает еще и как адаптер.
|
|||
|
||||
| ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: 2 Всего: 4 |
я так ничего и не поняла
как реализовать первый вариант? Это сообщение отредактировал(а) ElKa - 18.8.2008, 11:44 |
|||
|
||||
| alexadr |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 25.9.2006 Репутация: 4 Всего: 4 |
интервейс
реализующие этот интерфейс классы:
использование всего ентого добра:
|
||||||
|
|||||||
| ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: 2 Всего: 4 |
alexadr,
то есть придется везде вместо Object писать GetNameInterf? |
|||
|
||||
| AxNe0 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 24.4.2006 Где: St. Petersburg Репутация: 4 Всего: 5 |
ElKa, если это для решения твоей задачи с вызовом toEffString(), то это неправильный подход с точки зрения ООП!
Это сообщение отредактировал(а) AxNe0 - 18.8.2008, 13:14 |
|||
|
||||
| ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: 2 Всего: 4 |
AxNe0,
какой подход неправильный? мой? |
|||
|
||||
| alexadr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 25.9.2006 Репутация: 4 Всего: 4 |
||||
|
||||
| AxNe0 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 24.4.2006 Где: St. Petersburg Репутация: 4 Всего: 5 |
ElKa, да.
|
|||
|
||||
| ElKa |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: 2 Всего: 4 |
а почему FirstClass_name, а не FirstClass? |
||||
|
|||||
| Ortega |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 5.11.2005 Где: Харьков, Украина Репутация: 4 Всего: 6 |
Так нужно именно имя класса?
--------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок |
|||
|
||||
| ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: 2 Всего: 4 |
все равно не получается
мне не стринг нужен, а класс а стринг я не могу задать как имя класса
defOutVar() в интерфейсе нет.. как мне его вызвать? |
|||
|
||||
| Ortega |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 5.11.2005 Где: Харьков, Украина Репутация: 4 Всего: 6 |
ElKa, ОСТАНОВИСЬ! И сформулируй, пожалуйста, задачу.
--------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок |
|||
|
||||
| ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: 2 Всего: 4 |
Ortega, ну я же сформулировала.. у меня объекты разных классов обрабатываются по очереди.. для каждого из них вызывается метод.. надо узнать их классы чтобы его вызывать.. я сделала интерфейс и в каждом классе добавила метод который возвращает имя класса как стринг.. но использовать этот стринг в других случаях я не могу.. если мне например надо для некоторых объектов вызвать другой метод которого нет у других.. получается опять та же проблема: как узнать класс? |
|||
|
||||
| AxNe0 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 24.4.2006 Где: St. Petersburg Репутация: 4 Всего: 5 |
ElKa, создай хорошую объектно-ориентированную модель. Если не знаешь как или не можешь, опиши поподробнее структуру, какие есть классы, для чего они нужны и пр.
|
|||
|
||||
| ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: 2 Всего: 4 |
AxNe0,
у меня есть разные классы объектов.. для каждого из них есть метод для печати.. для этого я сделала интерфейс и там этот метод задекларировала.. а потом в каждом классе заимплементировала.. это работает.. но еще например некоторые объекты могут быть двух видов.. например Предикат это или if-выражение или определение переменной x=... и в этих двух классах есть метод которого нет в других.. и в этом общем объекте Предикат мне надо его вызвать.. как мне получить класс для этого.. мне что же теперь для каждого случая интерфейс создавать? |
|||
|
||||
| Ortega |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 5.11.2005 Где: Харьков, Украина Репутация: 4 Всего: 6 |
ElKa, без обид, пожалуйста, но мне кажется, что имеет место быть попытка удаления гланд через известное место.
Я в том смысле, что возможно, тут можно оюойтись без извращений и все намного проще? Давай ты расскажешь нам, чего именно ты пытаешься добиться этими манипуляциями. Добавлено через 1 минуту и 55 секунд
А еще есть наследование.... Когда у классов, имеющих что-то общее, есть общий класс-предок. Elka, почитай основы ООП. --------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок |
|||
|
||||
| ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: 2 Всего: 4 |
Ortega,
у всех этих классов есть предок это узел синтаксического дерева.. они его наследуют.. так что еще одно наследование исключается.. но неужели нет никакой относительно простой возможности узнать класс объекта??? |
|||
|
||||
| alexadr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 25.9.2006 Репутация: 4 Всего: 4 |
||||
|
||||
| Ortega |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 5.11.2005 Где: Харьков, Украина Репутация: 4 Всего: 6 |
Полиморфизм, полиморфизм и еще раз полиморфизм
Вот примерно такая будет иерархия. ![]()
--------------------
Всему свое время (с) ЧайфНе парься, будь счастлив (с) Пеппи Длинный Чулок |
||||
|
|||||
| AxNe0 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 263 Регистрация: 24.4.2006 Где: St. Petersburg Репутация: 4 Всего: 5 |
ElKa, ты не с той стороны пытаешься решить задачу. Хорошая, с точки зрения ООП, структура классов и интерфейсов может существенно облегчить жизнь. Раз мы выяснили-таки, что у классов есть что-то общее, что мешает создать нечто подобное:
а туда, где тебе надо вызывать methodPredicate(), передавай массив Predicate[] predicates. И все будет удобно, красиво и поддерживаемо. Добавлено @ 16:26 Ortega, +1 Это сообщение отредактировал(а) AxNe0 - 18.8.2008, 16:27 |
|||
|
||||
| ElKa |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 300 Регистрация: 1.2.2006 Репутация: 2 Всего: 4 |
AxNe0,
нет, они не extends предикат.. потому что они у него ничего не наследуют они наследуют у узла, так же как и предикат |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |