По мотивам - http://programmingmindstream.blogspot.ru/2014/01/class-constructor-class-destructor.html
Вот мне интересно, что будет, если написать что-то вроде:
И Когда? И попадём ли в TA.CreateList?
И когда?
ИНТЕРЕСНЫЙ вопрос... ЗАВТРА - ПРОВЕРЮ...
Вот мне интересно, что будет, если написать что-то вроде:
type TA = class strict protected class var f_list: TList; protected class function CreateList: TList; virtual; public class constructor Create; end;//TA TSomeOtherList = class(TList) end;//TSomeOtherList TB = class(TA) protected class function CreateList: TList; override; end;//TB class function TA.CreateList: TList; begin Result := TList.Create; end; class constructor TA.Create; begin inherited; f_List := CreateList; end; class function TB.CreateList: TList; begin Result := TSomeOtherList.Create; end;Мы в TB.CreateList попадём?
И Когда? И попадём ли в TA.CreateList?
И когда?
ИНТЕРЕСНЫЙ вопрос... ЗАВТРА - ПРОВЕРЮ...
На первый взгляд криминала нет, раз функция возврата списка перекрывается, то по идее работать должно...
ОтветитьУдалитьа классовая переменная f_list существует ведь в единственном варианте... и наследники её перезапишут
ОтветитьУдалитьнаверняка будет хрень (вот если бы можно было переменную пометить словом virtual или как-нить ещё)
хм... а ведь для TB класс-конструктор явно не указан.. вот кстати хорошая задачка
ОтветитьУдалитьправильные вопросы задаёте. Они собственно и подразумевались.
ОтветитьУдалитьНу а если TA будет абстракным?
ОтветитьУдалитьОб этом я тоже уже думал :-) но не попробовал. Дома попробую всякие варианты.
ОтветитьУдалитьВот и ответ про виртуальность:
ОтветитьУдалитьtype
Log = class abstract
strict private
class var FLogger: IInterface;
class constructor Create;
public
type
ToStringFunc = reference to function(O: TObject) : String;
class procedure d(const Msg: String); overload;
class procedure d(const Fmt: String; const Args: array of const); overload;
class procedure d(const Tag: String; const Instance : TObject; const Msg : String); overload;
class procedure d(const Tag: String; const Instance : TObject; const Method : String; const Msg : String); overload;
class procedure TimeStamp(const Msg: String); overload;
class function ObjToString(const Instance : TObject) : String;
// class function ArrayToString(AArray : TEnumerable) : String; overload;
class function ArrayToString(const AArray : TEnumerable) : String; overload;
class function ArrayToString(const AArray : TEnumerable; MakeStr : ToStringFunc) : String; overload;
class procedure DumpFmxObject(const O: TFmxObject; Nest: Integer = 0);
end;