Rtti Ortak Method Çağırma(Poliformizm İçerir)

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
ismailkocacan
Üye
Mesajlar: 88
Kayıt: 25 Eyl 2011 06:11
Konum: İstanbul
İletişim:

Rtti Ortak Method Çağırma(Poliformizm İçerir)

Mesaj gönderen ismailkocacan »

Kod: Tümünü seç

{ By İsmail Kocacan }

unit uReflection;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.StdCtrls,

  System.Rtti,
  System.TypInfo;

type
  TForm1 = class(TForm)
    Button1: TButton;
    lBox: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TTabanClass = class abstract(TObject)
  protected
    procedure Guncelle; virtual; abstract;
  end;

  TGumrukYonetmeligi = class(TTabanClass)
  public
    procedure Guncelle; override;
  end;

  TTebligler = class(TTabanClass)
  public
    procedure Guncelle; override;
  end;

var
  Form1: TForm1;

  atebligler: TTebligler;
  agumrukyonetmeligi: TGumrukYonetmeligi;

implementation

{$R *.dfm}

{ TTebligler }
procedure TTebligler.Guncelle;
begin
  ShowMessage('Tebliğler Güncellendi...');
end;

{ TGumrukYonetmeligi }
procedure TGumrukYonetmeligi.Guncelle;
begin
  ShowMessage('Gümrük Yönetmeliği Güncellendi...');
end;



procedure TForm1.Button1Click(Sender: TObject);
var
  r: TRttiContext;
  rtype: TRttiType;
  obj: TObject;
begin
  r := TRttiContext.Create;
  for rtype in r.GetTypes do
  begin
    if (rtype.TypeKind = tkClass) and rtype.IsInstance and
      rtype.AsInstance.MetaclassType.InheritsFrom(TTabanClass) and
      (rtype.Name <> TTabanClass.ClassName) then
    begin
      lBox.Items.Add(rtype.Name);
      obj := rtype.AsInstance.MetaclassType.Create;
      TTabanClass(obj).Guncelle;
    end;
  end;
  r.Free;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  atebligler         := TTebligler.Create;
  agumrukyonetmeligi := TGumrukYonetmeligi.Create;
end;

end.
Yukarıda TTabanClass isminde soyut bir sınıf ve bu sınıfa ait Guncelle isminde soyut bir prosedür var.
TGumrukYonetmeligi ve TTebligler sınıfları TTabanClass isimli sınıftan türetilmiş ve Güncelle prosedürlerinin gövdeleri yapılandırılmıştır.
FormCreate eventinde de TTabanClass sınıfından türetilen TTebligler ve TGumrukYonetmeligi sınıflarından birer tane nesne referansı oluşturulmuştur.

Şimdi benim yapmak istediğim de şuydu.
"TTabanClass" sınıfından türeyen tüm sınıfların,nesne referanslarının, ortak methodu olan "Guncelle" prosedürünü çalıştırmaktı.
Yaptım oldu :D
Dosya ekleri
Reflection.rar
XE2
(102.33 KiB) 201 kere indirildi
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2130
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: Rtti Ortak Method Çağırma(Poliformizm İçerir)

Mesaj gönderen sadettinpolat »

Burda biraz eksik var.
Rtti ile sinif tiplerine bagimli kalmamak onemlidir. ornekte ise TTabanClass(obj).Guncelle; satiri ile TTabanClass sinifina bir bagimlilik mevcut. Bunun yerine rtti ' nin invoke metodu ile obj.invoke('guncelle') tarzi bir kod yazmak daha dogru olacaktir

http://robstechcorner.blogspot.com/2009 ... asics.html
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
ismailkocacan
Üye
Mesajlar: 88
Kayıt: 25 Eyl 2011 06:11
Konum: İstanbul
İletişim:

Re: Rtti Ortak Method Çağırma(Poliformizm İçerir)

Mesaj gönderen ismailkocacan »

Açıkcası ilk yapmaya çalıştığım, bahsettiğiniz gibi obj.invoke('guncelle') şeklinde çağırmaktadı.Fakat beceremedim. :D

Yeni hali :

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  r: TRttiContext;
  rtype: TRttiType;
  riType: TRttiInstanceType;
  obj: TValue;
begin
  r := TRttiContext.Create;
  for rtype in r.GetTypes do
  begin
    if (rtype.TypeKind = tkClass) and rtype.IsInstance and
      rtype.AsInstance.MetaclassType.InheritsFrom(TTabanClass) and
      (rtype.Name <> TTabanClass.ClassName) then
    begin
      lBox.Items.Add(rtype.Name);
      riType := TRttiInstanceType(r.FindType(rtype.QualifiedName));
      obj := riType.GetMethod('Create').Invoke(riType.MetaclassType, []);
      riType.GetMethod('Guncelle').Invoke(obj, []);
    end;
  end;
  r.Free;
end;
Verdiğiniz link faydalı oldu.
Teşekkürler.
Dosya ekleri
Reflection.rar
(103.55 KiB) 203 kere indirildi
Cevapla