Тип элементов в Vector

Модератор: Absurd

Ответить
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Внимательно выслушав ответы на предидущие вопросы, решил задать ещё один :D

Как известно класс java.util.Vector содержит обьекты класса Object.

Есть класс Station,
есть класс ProcStation extends Station.

У каждого из них есть метод draw():
в Station рисуется прямоугольник,
в ProcStation вызывается super.draw(), чтобы нарисовать прямоугольник и дополнительно рисуются линии..


Обьекты классов Station и ProcStation добавляются в вектор и потом рисуются:

((Station) vector.elementAt(i)).draw();

Но в этом случае метод draw класса ProcStation вызван не будет.

Я решаю эту проблему так (это всё в цикле, ясное дело, происходит):

Код: Выделить всё

Class tempClass = vector.elementAt(i).getClass();
Class stationClass = (new Station()).getClass();
Class procStationClass = (new ProcStation()).getClass();

if (tempClass == stationClass) ((Station) vector.elementAt(i)).draw();
else if (tempClass == procStationClass) ((ProcStation) vector.elementAt(i)).draw();
Но это опять же не красиво, и должен быть способ это проще сделать.
Может знает кто?
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Конечно же можно и так писать:

Код: Выделить всё

Station station = new Station();

if (station.getClass().getName()=="Station") System.out.println("Success");
Но во-первых getName возвращает полное квалифицированное имя. Если вдруг прийдётся менять пакет - то во многих кусках кода прийдётся делать соответствующий изменения.
Конечно можно выбирать из результата getName только слово стоящее после последней точки .. Но это опять же только увеличит запутанность всего..

А во-вторых, хотелось бы это вообще без этих if else сделать.
Я бы хотел, чтобы оно выглядело примерно так:

Код: Выделить всё

(((vector.elementAt(i)).getClass()) vector.elementAt(i)).draw();
Первая часть выдаёт класс и во второй вызывается draw в соответствии с классом... но не проходит такая запись ...
Оно мне говорит, что первая часть - это не statement :-(

Эх .. чую так оно и останется ...
Аватара пользователя
AiK
Сообщения: 2287
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

М-дя. Рекомендую почитать Философию Java (Thinking in Java) Эккеля.
Смотри, какие чудеса :) умеет вытворять OOP:

Код: Выделить всё

A.java
------------------------
public class A {
        public A(){
        }
  
        void showMe(){
            System.out.println("I' am parent");
        }

}


A1.java
-----------------
public class A1 extends A{
        public A1(){
        }
  
        void showMe(){
            System.out.println("I' am child A1");
        }

}

A2.java
------------------------

public class A2 extends A{
        public A2(){
        }
  
        void showMe(){
            System.out.println("I' am child A2");
            super.showMe();
        }

}

oop.java
-----------------------
import java.util.Vector;

class oop  {
    public static void main(String[] args) {
        Vector v = new Vector();
        v.add(new A());
        v.add(new A1());
        v.add(new A2());
        for (int i=0; i<v.size(); i++){
            ((A) v.get(i)).showMe();
        }
    }
};

E:\java>java oop
I' am parent
I' am child A1
I' am child A2
I' am parent
Как говорится - ловкость рук и никакого мошенничества.
Даже самый дурацкий замысел можно воплотить мастерски
Аватара пользователя
Oscar
Сообщения: 963
Зарегистрирован: 29 май 2004, 13:44
Откуда: Мюнхен (рожден в Киеве)
Контактная информация:

Мда ... :D

А я так пробовал - у меня не получилось )))
Сейчас попробовал ещё раз - всё, как по маслу ))
Может я первый раз его просто перекомпилировать забыл ;-)

Спасибо!! ))
Ответить