Форум: "Потрепаться";
Текущий архив: 2002.03.28;
Скачать: [xml.tar.bz2];
ВнизВопрос о распространнёности Delphi в мире. Найти похожие ветки
← →
iZEN (2002-02-16 11:10) [77]/** vuk © (14.02.02 22:07):
<...>Мы хотим создать экземпляр класса, но какого конкретно, на момент компиляции мы не знаем - это определяется только в момент выполнения.<...>
В Object Pascal это делается иначе, поскольку есть такая вещь, как ссылки на класс (метаклассы). Если есть ссылка на класс, можно свободно вызывать через нее методы класса и конструкторы. Вызов нужного конструктора обеспечивается за счет механизма виртуальных конструкторов.<...>
Как кто-то однажды сказал, в OP "любой класс сам себе фабрика", но это не совсем точно, поскольку возможности несколько шире.
*/
Я могу дополнить: "в OP "любой класс сам себе фабрика" только на этапе компиляции и последующего исполнению -- потом это уже не имеет значения, поскольку приложение откомпилировано, скомпоновано и "заморожено" в EXE-файл(использование для этого DLL требует разработки собственного "уникального" механизма Plug-in или же "Добро пожаловать в COM").
Полная динамическая линковка (подгрузка новых классов в работающую программу, создание объектов-экземпляров новых классов и исполнение их кода) возможна в Java -- это, как правило, происходит в любой программе, написанной на ней -- программа начинает выполняться ещё до полной загрузки всех составляющих её классов :).
Например, можно воспользоваться механизмом явной загрузки класса и активации.
Пусть у нас имеется интерфейс:
public interface Figure {
public void draw(Canvas cnv);
}
Java-разработчику влом создавать классы фигур(точка, линия, окружность, овал, прямоугольник, полигон), реализующие интерфейс Figure. Поэтому он выпустил приложение БЕЗ графической библиотеки.
Что ж, если мне известен интерфейс Figure, то я могу без труда реализовать его для любой своей фигуры, а в программе указать её class-файл с кодом.
public class Circle implements Figure {
...
draw(Canvas cnv) {
cnv.drawOval(...);
}
...
}
А вот отрывок кода программы того программиста:
/** Редактор */
public class GraphEditor {
/*
* Метод, где в принципе неизвестен тип реальной фигуры
* на этапе компиляции
*/
private void paint(Figure f) {
f.draw(this.getCanvas());
}
/* "Точка входа" в приложение */
public static void main(String[] args) {
Editor ed = new Editor(..);
// Типичное использование авторских фигур:
//Oval ov = new Oval(..);
//Square sq = new Square(..);
//ed.paint(ov);//Вывод Овала
//ed.paint(sq);//Вывод Квадрата
/* Внимание! Динамическая загрузка класса и выполнение кода. */
try {
/*
* Загружаем любой новый класс,
* имя которого указано в параметрах командной строки.
* Например: args[0] содержит "mypackage.Circle"
*/
Class c = Class.forName(args[0]);
/*
* Создаём экземпляр класса...
*/
Object o = c.newInstance();
/*
* Нисходящее приведение типа к интерфейсу Figure...
*/
Figure etc = (Figure)o;
/*
* Рисуем фигуру...
*/
ed.paint(etc);//Вывод фигуры без перекомпиляции!!!
catch(Exception noex) {//Не обрабатываем для простоты
}
}
}
Я привёл только "вершину айсберга". В Java есть развитый Reflection API, методы которого могут "вытрясти" всю подноготную любого класса(представленного без исходника) и дать возможность "попользоваться" им по полной программе БЕЗ ПЕРЕКОМПИЛЯЦИЙ приложения.
Попробовали бы Вы проделать то же самое в приложении на ObjectPascal -- придётся свою Delphi писать...
Страницы: 1 2 3 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.03.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c