четверг, 16 января 2014 г.

Про class constructor'ы №2

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

И даже в таком примере не вызовется ни TB.CreateList, ни (что "УДИВИТЕЛЬНО") TB.Create:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
  FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
  FMX.Layouts, FMX.Memo;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

type
 TA = class
  strict protected
   class var f_list: TList;
  protected
   class function CreateList: TList; virtual;
  public
   class constructor Create;
   class function List: TList;
 end;//TA

 TSomeOtherList = class(TList)
 end;//TSomeOtherList

 TB = class(TA)
  protected
   class function CreateList: TList; override;
  public
   class constructor Create;
 end;//TB

class function TA.List: TList;
begin
 Result := f_List;
end;

class function TA.CreateList: TList;
begin
 Result := TList.Create;
end;

class constructor TA.Create;
begin
 inherited;
 f_List := CreateList;
end;

class constructor TB.Create;
begin
 inherited;
end;

class function TB.CreateList: TList;
begin
 Result := TSomeOtherList.Create;
end;

{$R *.fmx}

procedure TForm1.FormShow(Sender: TObject);
begin
 TB.List;
 TA.List;
 TB.List;
end;

end.

Исходный код примера тут - https://sourceforge.net/p/rumtmarc/code-0/HEAD/tree/trunk/Blogger/DraftsAndScketches/SomeTestProjects/ClassConstructor1/

Так что "ещё раз" - будьте осторожны.

В ТРАКТОВКЕ "новых языковых" фич.

2 комментария:

  1. а если его объявить виртуальным? class constructor Create; virtual; для TA и override для TB

    ОтветитьУдалить
    Ответы
    1. "а если его объявить виртуальным? class constructor Create; virtual; для TA и override для TB"

      Вот не пробовал :-) Скорее всего компилятор - ЗАРУГАЕТСЯ. Если я ПРАВИЛЬНО понял его логику. Сегодня уже не буду пробовать :-) Можете сами попробовать. Ссылки на примеры - я дал.

      Удалить