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


Автор: ElKa 18.8.2008, 11:43
есть выражение, состоящее из подвыражений
подвыражения - это объекты разных классов
каждое подвыражение тоже состоит из подвыражений
в общем они все вложены
надо вывести выражение на печать, при этом преобразовывая названия переменных x в x'
переменная -это один из объектов
для этого надо этот же метод вызвать для каждого объекта и  в нем тоже преобразовать переменные
для этого мне надо узнать его класс

как это лучше реализовать? 
 

Автор: AxNe0 18.8.2008, 11:53
не совсем понятно, что именно требуется.... можно пример?

Автор: ElKa 18.8.2008, 12:04
object = object1 object2 ... objectN
object1 = object11 object12 ... object1M
.
.
.

objectIJ это может быть какое нибудь арифметическое выражение или логическое или с множествами

например 
object = (x+y) - ((x+z) - 2*y)
object1 = (x+y)
object2 = "-"
object3 = ((x+z) - 2*y)

и т.д.


теперь надо вызвать 
object.toEffString()


Код


String toEffString(){
   String str = "";
   for(int i=0;i<objects.size();i++)
     str = str + objects.get(i).toEffString(); // но класс объекта неизвестен.. метод вызвать нельзя
   return str;
}


что делать?

Автор: Ortega 18.8.2008, 12:12
И снова, интерфейсы тебе в помощь!
Скажи, пожалуйста, вот эти все объекты - это твоих рук дело и ли стороння библиотека?

Автор: AxNe0 18.8.2008, 12:20
если надо парсить арифметические выражения, то есть несколько готовых алгоритмов, например http://algolist.manual.ru/syntax/parsear.php.

что должен делать метод object.toEffString() ? и должен быть класс у этих object'ов ?

Автор: ElKa 18.8.2008, 12:38
Цитата(Ortega @ 18.8.2008,  12:12)
И снова, интерфейсы тебе в помощь!
Скажи, пожалуйста, вот эти все объекты - это твоих рук дело и ли стороння библиотека?

моих.. я написала класс для каждого выражения

Добавлено через 2 минуты и 32 секунды
AxNe0, 

нет там не только арифметические.. там целый язык спецификаций надо парсить
метод toEffString() выдает модифицированный стринг этого выражения

классы у объектов есть.. для каждого выражения свой класс
из них синтаксическое дерево строится 

Автор: AxNe0 18.8.2008, 13:07
кажется, становится ясно smile
т.е. у тебя есть несколько классов, характеризующих разные выражения. В каждом классе есть метод toEffString().
Чтобы можно было вызвать метод, не зная точного класса, как уже сказал товарищ (или господин, как ему будет угоднее ;) ) Ortega, используй один из трех важнейших механизмов ООП - http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC_%D0%B2_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0%D1%85_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F. Т.е. Создай либо интерфейс, либо абстрактный класс (если реализация этого метода везде одинаковая) и реализуй/наследуй его в своих классах.

Автор: AxNe0 18.8.2008, 13:28
Вот пример использования интерфейсов для подобной задачи:

Код
interface InterfaceClazz {
    public String toEffString();
}

class Clazz1 implements InterfaceClazz {
    public String toEffString() {
        // do stuff
    }
}

class Clazz2 implements InterfaceClazz {
    public String toEffString() {
        // do stuff
    }
}

// etc.


тогда надо будет хранить не массив/коллекцию Object[] objects, а InterfaceClazz[] objects и твой код выше будет работать без всяких изменений

Добавлено через 4 минуты и 13 секунд
а вообще, еще лучше создать абстрактный класс, т.к. видимо, метод везде один и тот же:

Код
abstract class AbstractCommonClazz {
    List<AbstractCommonClazz> objects;
    
    String toEffString(){
        String str = "";
        for(int i=0;i<objects.size();i++)
          str = str + objects.get(i).toEffString();
        return str;
     }
}

class Clazz1 extends AbstractCommonClazz {
    // do stuff
}

class Clazz2 extends AbstractCommonClazz {
    // do stuff
}


вот, как-то так...

Автор: ElKa 18.8.2008, 14:09
AxNe0, 

спасибо.. уже пишу.. 
но абстрактный класс не нужен, потому что метод везде разный  smile 

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