Я работаю над проектом, содержащим несколько пакетов. В одном из моих базовых пакетов я объявляю такой умный указатель (вот полный код):
unit UTWSmartPointer;
interface
type
IWSmartPointer<T> = reference to function: T;
TWSmartPointer<T: class, constructor> = class(TInterfacedObject, IWSmartPointer<T>)
private
m_pInstance: T;
public
constructor Create; overload; virtual;
constructor Create(pInstance: T); overload; virtual;
destructor Destroy; override;
function Invoke: T; virtual;
end;
implementation
//---------------------------------------------------------------------------
constructor TWSmartPointer<T>.Create;
begin
inherited Create;
m_pInstance := T.Create;
end;
//---------------------------------------------------------------------------
constructor TWSmartPointer<T>.Create(pInstance: T);
begin
inherited Create;
m_pInstance := pInstance;
end;
//---------------------------------------------------------------------------
destructor TWSmartPointer<T>.Destroy;
begin
m_pInstance.Free;
m_pInstance := nil;
inherited Destroy;
end;
//---------------------------------------------------------------------------
function TWSmartPointer<T>.Invoke: T;
begin
Result := m_pInstance;
end;
//---------------------------------------------------------------------------
end.
Позже в моем проекте (и в другом пакете) я использую этот умный указатель с объектом GDI + (TGpGraphicsPath). Объявляю графический путь так:
...
pGraphicsPath: IWSmartPointer<TGpGraphicsPath>;
...
pGraphicsPath := TWSmartPointer<TGpGraphicsPath>.Create();
...
Однако, когда я выполняю код, на экране ничего не отображается. Я не получаю ни ошибки, ни исключения, ни нарушения прав доступа, просто пустая страница. Но если я просто изменю свой код вот так:
...
pGraphicsPath: IWSmartPointer<TGpGraphicsPath>;
...
pGraphicsPath := TWSmartPointer<TGpGraphicsPath>.Create(TGpGraphicsPath.Create);
...
потом все стало нормально, и мой путь нарисован именно так, как положено. Но я не могу понять, почему первый конструктор не работает должным образом. Кто-нибудь может объяснить мне это странное поведение?
С Уважением
TGpGraphicsPath
не имеет параметра в конструкторе. - person Remy Lebeau   schedule 15.02.2017IWSmartPointer
не объявлен какinterface
, поэтому его нельзя использовать в объявленииclass()
. И не имеет смысла назначать указатель объекта наreference to function
. Кроме того,Invoke()
неправильно назван, так как он просто возвращает указатель на управляемый объект, но на самом деле ничего не вызывает. Я бы переименовал его вGetObject()
или аналогичный, а затем определил быproperty
для его вызова. - person Remy Lebeau   schedule 15.02.2017TGpGraphicsPath
, имеют параметры - person David Heffernan   schedule 15.02.2017Invoke
назван правильно. Это имя единственного метода интерфейса анонимного метода. Это метод, который вызывается при вызове метода anon. Здесь вы упускаете некоторые важные подробности, и пока вы не поймете, я не уверен, что такие комментарии очень полезны. - person David Heffernan   schedule 15.02.2017