среда, 15 января 2014 г.

ToDo. Class constructor и виртуальность

По мотивам - http://programmingmindstream.blogspot.ru/2014/01/class-constructor-class-destructor.html

Вот мне интересно, что будет, если написать что-то вроде:

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?

И когда?

ИНТЕРЕСНЫЙ вопрос... ЗАВТРА - ПРОВЕРЮ...

7 комментариев:

  1. На первый взгляд криминала нет, раз функция возврата списка перекрывается, то по идее работать должно...

    ОтветитьУдалить
  2. а классовая переменная f_list существует ведь в единственном варианте... и наследники её перезапишут
    наверняка будет хрень (вот если бы можно было переменную пометить словом virtual или как-нить ещё)

    ОтветитьУдалить
  3. хм... а ведь для TB класс-конструктор явно не указан.. вот кстати хорошая задачка

    ОтветитьУдалить
  4. правильные вопросы задаёте. Они собственно и подразумевались.

    ОтветитьУдалить
  5. Ну а если TA будет абстракным?

    ОтветитьУдалить
  6. Об этом я тоже уже думал :-) но не попробовал. Дома попробую всякие варианты.

    ОтветитьУдалить
  7. Вот и ответ про виртуальность:

    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;

    ОтветитьУдалить