late binding etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
late binding etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

2 Haziran 2016 Perşembe

Polymorphism ve Pointer ilişkisi

OOP programlamanın özelliklerinden biri olan Polymorphism mekanizmasının nasıl çalıştığını incelemeye çalışacağız.Wiki sayfasında görüleceği üzere Polymorphism'in farklı şekilleri mevcut.
Bizim inceleyeceğimiz türü ise Subtyping Polymorphism.


Subtyping Polymorphism'in implementasyonundaki ilüzyon ise şu şekilde açıklanabilir; 
Derleyici virtual method (yada diğer adıyla function) tanımlı bir sınıf tespit ettiğinde, sınıfın içerisine fonksiyonların pointer(adres) bilgilerini tutacağı gizli bir array, diğer adıyla virtual method table(VMT) yerleştirmekte ve daha sonra bu array içerisindeki pointerlara (adreslere), alt sınıfta ki fonksiyonların pointer bilgisini set etmektedir.
Fonksiyon pointer'larının çalışma zamanında set edilmesi veya değiştirilmesinin diğer adı "run time method binding" yada late binding olarak ifade edilmektedir.


Kod üzerinden mekanizmanın nasıl çalıştığını anlamaya çalışalım.
C++
Delphi

Yukarıda ki C++ kod bloğunda Calculation sınıfında Calc ismine sahip bir pure virtual function ve yine 
Calculation sınıfından miras alan CalculationSum ve CalculationDiv sınıflarını görmekteyiz.

Kodu çalıştırıp, inceleyecek olursak; 
Calculation sınıfı içersinde ki Calc fonksiyonunun,CalculationSum(Sub Class) içinde ki Calc fonksiyonuna yönlendirildiği,diğer adıyla method binding işleminin gerçekleştiğini görebiliriz.


calculation ve CalculationSum içersinde vftable array'lerin, ilk elemanlarında ki Calc fonksiyonlarına ait adreslerin(
Sarı ile çizili) aynı olduğu görebiliriz.

Class,virtual function olmasaydı,yada method binding işlemini biz yapmak isteseydik basit olarak nasıl yapabilirdik ?

C++
Delphi

Son olarak bu konuyu araştırmamı salık veren Tuğrul Beye teşekkür etmeden geçmek olmaz.  :)


28 Ağustos 2012 Salı

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

{ 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üzenlemeler : DelphiTürkiye Forum