Вниз
Скачать: CL | DM;

Вопрос о распространнёности 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.016 c
3-90803
arnold lane
2002-03-04 20:59
2002.03.28
вопрос


3-90805
lightix
2002-03-04 15:36
2002.03.28
Помогите с БД + Quick REPORT


3-90762
af
2002-03-01 18:04
2002.03.28
Что за ошибка такая и как устанить =Blob already open =?


4-91107
IronHawk
2002-01-28 16:00
2002.03.28
Преобразование String to TCaption и Наоборот ..??


1-90842
Velocity
2002-03-16 16:45
2002.03.28
Икона для программулины...




   Наверх