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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Cast 
V
    Опции темы
W0LF
Дата 4.11.2006, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Допустим есть какой-то класс.
Код

public class A{
    public void A() {
        
    }
    public void func() {
        blablabla
    }
}

есть еще класс.
Код

public class B{
    public void B() {
        
    }
    public void func() {
        albalbalb
    }
}

Классы разные, по разному работают но у них есть метод func
в другом каком-нидь классе делаем :
Код

Object o = null;
A a = new A();
B b = new B();
o = a;

так вот вопрос - как теперь у объекта о вызвать метод func?
Примечание - мы не знаем, на какой объект ссылается в данный момент о. то ли на А то ли на В
поэтому не можем его привести к классу А или классу В.
Решение с интерфейсом не подходит!


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
powerOn
Дата 4.11.2006, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



а оператор instanceof не поможет?

Код

if (o instanceof A) {
    A oa = (A) o;  
} else if (o instanceof B) {
    B ob = (B) o; 
}


хотя, поскольку и Класс А и Класс В содержит метод func(), то можно приводить всегда к А, метод все равно вызовется класса В, ибо динамический поиск определяет метод по реальному типу объекта а не по типу ссылки....




--------------------
user posted image нет времени думать - нужно писать КОД!

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


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(powerOn @  4.11.2006,  19:35 Найти цитируемый пост)
хотя, поскольку и Класс А и Класс В содержит метод func(), то можно приводить всегда к А, метод все равно вызовется класса В, ибо динамический поиск определяет метод по реальному типу объекта а не по типу ссылки....

Так B не унаследован от A, будт ClassCastException.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
powerOn
Дата 4.11.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(LSD @  4.11.2006,  19:45 Найти цитируемый пост)
Так B не унаследован от A, будт ClassCastException. 

Опа! Точно.. не заметил...  smile 


--------------------
user posted image нет времени думать - нужно писать КОД!

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


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Цитата

Опа! Точно.. не заметил...  smile  

smile
Цитата

Код

if (o instanceof A) {
    A oa = (A) o;  
} else if (o instanceof B) {
    B ob = (B) o; 
}


таких классов как А и В может быть очень много(это разные формы в приложении), поэтому не подходит smile
много if делать, а потом еще и код править для добавления их...
То-есть напрямую никак нельзя по ссылке привести к этому классу?

Добавлено @ 20:06 
Я конечно могу сделать два базовых класса, котрые делятся на Form и List. а от них уже наследовать все остальное. Тогда прокатит - 
Код

if (o instanceof A) {
    A oa = (A) o;  
} else if (o instanceof B) {
    B ob = (B) o; 
}

Но просто именно от этого кода я щас и пытаюсь избавиться smile

Это сообщение отредактировал(а) W0LF - 4.11.2006, 20:04


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
LSD
Дата 4.11.2006, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(W0LF @  4.11.2006,  20:03 Найти цитируемый пост)
То-есть напрямую никак нельзя по ссылке привести к этому классу?

К какому этому? ;)

Интерфейс именно для того и нужен, чтобы гарантировать что в классе есть метод с заданное сигнатурой. И в подобных случаях он очень хорошо подходит. Не понимаю почему ты не хочешь его использовать.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
powerOn
Дата 4.11.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(W0LF @  4.11.2006,  20:03 Найти цитируемый пост)
таких классов как А и В может быть очень много(это разные формы в приложении), поэтому не подходит

Тогда один интерфейс конечно надо реализовывать во всех классах...  А почему с интерфейсами не получается?



--------------------
user posted image нет времени думать - нужно писать КОД!

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


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



с интерфейсами получается. просто класс+интерфейс = +50 байт памяти


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
LSD
Дата 4.11.2006, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



1. По моему даже для J2ME 50 байт это не такая уж и большая потеря.
2. Интерфейс будет существовать в единственном экземпляре, а увеличение размера класса от реализации интерфейса у меня получилось - 26 байт.
3. Сколько ты потеряешь на if-ах.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
W0LF
Дата 5.11.2006, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Да, действительно, мой интерфейс - 26 байт. КоммандЛистенер дает +50 байт.
а что касается ифов, то инода наших американских друзей очень трудно убедить, что ифы эт хорошо, и что много КоммандЛистенеров это тож хорошо smile


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
javastic
Дата 5.11.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

Репутация: 19
Всего: 27



Цитата

Примечание - мы не знаем, на какой объект ссылается в данный момент о. то ли на А то ли на В
поэтому не можем его привести к классу А или классу В.


А почему бы не сделать атрибут в каждом из классов (например А и Б), который бы выглядел например как :

Код

string final sign = "class_A"
...
string final sign = "class_B"



--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
LSD
Дата 6.11.2006, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(javastic @  5.11.2006,  17:11 Найти цитируемый пост)
А почему бы не сделать атрибут в каждом из классов (например А и Б), который бы выглядел например как :

А смысл? Проблема же в том как вызвать метод, с наименьшими затратами. На крайний случай getClass().getName() даст такой же эффект. И опять же объем.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
W0LF
Дата 6.11.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Цитата(LSD @ 6.11.2006,  00:38)
Цитата(javastic @  5.11.2006,  17:11 Найти цитируемый пост)
А почему бы не сделать атрибут в каждом из классов (например А и Б), который бы выглядел например как :

А смысл? Проблема же в том как вызвать метод, с наименьшими затратами. На крайний случай getClass().getName() даст такой же эффект. И опять же объем.

ага smile
Ну да ладно. Придется сделать два базовых класса. включить туда func(). и делать
Код

if (o instanceof A) {
    A oa = (A) o;  
} else if (o instanceof B) {
    B ob = (B) o; 
}

Спасибо всем за помощь!
З.Ы. Просто хотел сделать че-то типа такого :
((o.getClass())o).func() smile)))
строго за это не судите smile


Это сообщение отредактировал(а) W0LF - 6.11.2006, 15:46


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




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


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

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