Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Cast


Автор: W0LF 4.11.2006, 19:25
Допустим есть какой-то класс.
Код

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

Автор: powerOn 4.11.2006, 19:35
а оператор instanceof не поможет?

Код

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


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


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

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

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

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

Автор: W0LF 4.11.2006, 20:03
Цитата

Опа! Точно.. не заметил...  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

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

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

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

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

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

Автор: W0LF 4.11.2006, 20:37
с интерфейсами получается. просто класс+интерфейс = +50 байт памяти

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

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

Автор: javastic 5.11.2006, 17:11
Цитата

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


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

Код

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

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

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

Автор: W0LF 6.11.2006, 15:41
Цитата(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

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