Tôi có nguyên tử lạc lớp này initializer:Kết hợp Generics với các ràng buộc khác nhau
type
Atomic<T: IInterface> = class
type TFactory = reference to function: T;
class function Initialize(var storage: T; factory: TFactory): T;
end;
class function Atomic<T>.Initialize(var storage: T; factory: TFactory): T;
var
tmpIntf: T;
begin
if not assigned(storage) then begin
tmpIntf := factory();
if InterlockedCompareExchangePointer(PPointer(@storage)^, PPointer(@tmpIntf)^, nil) = nil then
PPointer(@tmpIntf)^ := nil;
end;
Result := storage;
end;
Bây giờ tôi muốn thực hiện cùng một khuôn mẫu cho các đối tượng.
Tôi có thể làm hai trong hai lớp riêng biệt, nhưng tôi thực sự muốn đặt cả hai bộ khởi tạo dưới cùng một ô. IOW, tôi lý tưởng muốn sử dụng điều này là
var
o: TObject;
i: IInterface;
Atomic<TObject>.Initialize(o, CreateObject);
Atomic<IInterface>.Initialize(i, CreateInterface);
Tôi không tìm được giải pháp nào tốt cho việc này. Ý tưởng duy nhất tôi nhận được là khai báo lớp là Atomic<T>
(không có ràng buộc) và sau đó bằng cách nào đó (chưa biết cách) kiểm tra RTTI của T trong thời gian chạy và tiến hành tương ứng.
Tôi không thích ý tưởng này nhiều và tôi đang tìm cách tiếp cận tốt hơn.
Điều này có vẻ hoạt động tốt, cảm ơn! – gabr
Chào mừng, @gabr, tôi rất vui vì tôi có thể trợ giúp! –