|
Указатель на класс в Дельфи (и других языках ООП)? | ☑ | ||
---|---|---|---|---|
0
H A D G E H O G s
11.12.14
✎
14:12
|
Дня доброго.
Можно как то в переменную записать указатель на класс (не на экземпляр класса). Смысл в том, что: 1) У меня есть несколько классов: AddInDataTransfer = class(TComObject, IDispatch, IInitDone, ILanguageExtender) AddInLibrary = class(TComObject, IDispatch, IInitDone, ILanguageExtender) 2) Их структура идентична, их различие во внутреннем объекте: protected // Переменная объекта внешней компоненты vk_object:T_vk_object; который определен из разных модулей (unit-ов). 3) Экземпляром класса де-юре является интерфейс IDispatch 4) Мне надо записать указатель на класс в таблицу вида TInterfaceRecord = record CLSID:TGUID; Addin:Pointer; end; var InterfaceTable: Array of TInterfaceRecord; и в нужный момент создавать экземпляр нужного класса в зависимости от GUID. Фух, как то так. |
|||
1
Ненавижу 1С
гуру
11.12.14
✎
14:17
|
есть же
type TClass = class of TObject; |
|||
2
Garykom
гуру
11.12.14
✎
14:18
|
(0) ВК - обертку для вызова других "не ВК" прог пишешь?
|
|||
3
H A D G E H O G s
11.12.14
✎
14:19
|
Пока выкручиваюсь так:
If IsEqualGUID(InterfaceTable[currentID].GUID,AddInDataTransfer_GUID) then resObj:=AddInDataTransfer.Create; If IsEqualGUID(InterfaceTable[currentID].GUID,AddInLibrary_GUID) then resObj:=AddInLibrary.Create; ... Быдлокод, учитывая то, что объектов уже 16. |
|||
4
H A D G E H O G s
11.12.14
✎
14:21
|
(1) Пни в хелп. Или кратко словами. Не знаю я этого вашего ООП.
(2) Нет. Хочу, чтобы моя ВК сама загружалась и сама выгружалась, "мягко, не нарушая сна" |
|||
5
Xapac
11.12.14
✎
14:23
|
(4)дллки делай
|
|||
6
Кирпич
11.12.14
✎
14:29
|
щас в гугле поищу. меня разбанили недавна
|
|||
7
Кирпич
11.12.14
✎
14:29
|
||||
8
Ненавижу 1С
гуру
11.12.14
✎
14:33
|
(4)
TBase=class end; TBaseClass = class of TBase; TMy1=class(TBase) end; TMy2=class(TBase) end; var Factory:TBaseClass; Factory:=TMy1; Factory.Create; //экземпляр TMy1 Factory:=TMy2; Factory.Create; //экземпляр TMy2 |
|||
9
Кирпич
11.12.14
✎
14:34
|
ну а вообще наверное так можно
TInterfaceRecord = record CLSID:TGUID; Addin:TClass; end; d : array [0..1] of TInterfaceRecord = (('{0780AD77-079D-480C-9467-3FD6841CF26B}',AddInDataTransfer),('{0780AD77-079D-480C-9467-3FD6841CF26B}',AddInLibrary)); если я всё не перепутал |
|||
10
Ненавижу 1С
гуру
11.12.14
✎
14:34
|
именно поэтому в Делфи у ЛЮБОГО класса есть public-конструктор Create, что не всегда приятно
|
|||
11
H A D G E H O G s
11.12.14
✎
14:39
|
Так, стоп, все я врубился.
|
|||
12
H A D G E H O G s
11.12.14
✎
14:39
|
Опять все переписывать
|
|||
13
DirecTwiX
11.12.14
✎
14:44
|
(10) А где иначе? И чем это неприятно?
|
|||
14
Ненавижу 1С
гуру
11.12.14
✎
17:15
|
(13) в С++/С# не так
у меня есть абстрактный базовый класс с публичным конструктором: class Base { public: Base() {...} virtual void Foo()=0; }; я хочу чтобы объекты классов-наследников могли быть созданы только некой фабрикой, тогда я делаю так: class Child:public Base { public: Foo() {...} protected: Child() {...} }; class Factory { private: template<class T> class PrivateChild:public T { public: PrivateChild(){} }; public: template<class T> Base* Create() { return new PrivateChild<T>(); } }; в делфи уже ничего не скроешь |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |