Имя: Пароль:
IT
 
Указатель на класс в Дельфи (и других языках ООП)?
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>();
}

};

в делфи уже ничего не скроешь