atsract metod ve AbstractError

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

atsract metod ve AbstractError

Mesaj gönderen ikra »

selamun aleykum

virtual; abstract; olarak tanimlanmis bir metodu override etmeden abstract olarak tanimlanan class icerisinde cagirdigimizda neden AbsractError verir?
override etmek zorundamiyiz?

örnegin

Kod: Tümünü seç

TMyClass = class(TObject)
private
  procedure AbstractMetoduCagir;
protected
  procedure Metodum; virtual; abstract;
end;

procedure TMyClass.AbstractMetoduCagir;
begin
  Metodum; // kullandigimda AbstractError aliyorum
end;
cevabiniz icin simdiden tesekkür ederim...
kıdemsiz üye
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: atsract metod ve AbstractError

Mesaj gönderen sabanakman »

abstract sadece bir metodu özetler ve her hangi bir kod barındırmaz. Nesneye yönelik programlamanın kuralı gereği bu metodu TMyClass sınıfından türetilmiş olan ve

Kod: Tümünü seç

procedure Metodum;override;
ile tanımlanmış alt (yavru) sınıfların Metodum'u çağırabilirsiniz. TMyClass'a ait Metodum'u kullanamazsınız.

Kod: Tümünü seç

type
  TAritmetik=class
    function islem(a,b:Integer):Integer;virtual;abstract;
  end;

  TTopla=class(TAritmetik)
    function islem(a,b:Integer):Integer;override
  end;

  TCikar=class(TAritmetik)
    function islem(a,b:Integer):Integer;override
  end;

  TCarp=class(TAritmetik)
    function islem(a,b:Integer):Integer;override
  end;

function TTopla.islem(a,b:Integer):Integer;
begin
  Result:=a+b;
end;

function TCikar.islem(a,b:Integer):Integer;
begin
  Result:=a-b;
end;

function TCarp.islem(a,b:Integer):Integer;
begin
  Result:=a*b;
end;
şeklinde bir sınıfı

Kod: Tümünü seç

var a:TAritmetik;
begin
  if CheckBoxTopla.Checked then a:=TTopla.Create
  else if CheckBoxCikar.Checked then a:=TCikar.Create
  else if CheckBoxCarp.Checked then a:=TCarp.Create
  
  ShowMessage(IntToStr(a.islem(5,4));

  a.free
end;
Dikkat edilirse TAritmetik sınıfının islem metodu direkt kullanılmamıştır. Bu sınıftan türeyen alt sınıfa ait metod işletilmiştir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: atsract metod ve AbstractError

Mesaj gönderen ikra »

hocam cevabin icin tesekkür ederim.

benim yapmak istedigim sey, baseclass'ta bu metodu tanimlayip isleme göre tetiklemek ve üst sinifta bunu override ederek tetiklenmis metod üzerinden islem yapmak.

eger ki, ancak üst sinifta tetiklenebiliniyor ise, alt sinifta bu metodu abstract olarak tanimlamanin anlami nedir?
ancak üst sinifta kullanabiliyorsam eger, o halde üst sinifta tanimlamak daha mantikli degil mi?
kıdemsiz üye
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: atsract metod ve AbstractError

Mesaj gönderen sabanakman »

Çağrılan metot illaki temel sınıfa ait olacaksa abstract ile soyutlamadan virtual olarak tanımlamanız gerekiyor. Tabi bu durumda kod yazılması şart.

Kod: Tümünü seç

type
  TAritmetik=class
    function islem(a,b:Integer):Integer;virtual;
  end;

function TAritmetik.islem(a,b:Integer):Integer;
begin

end;
Bu değişiklik yukarıdaki örneğin çalışma şeklinde bir sapma oluşturmaz. Örnek önceki durumuyla aynı çalışacaktır. Bu değişiklik sadece AbsractError hatası almamanızı sağlar.

Böyle bir kodla hata almasanız bile (bu şekliyle) metodu çağırmanın pek bir manası yoktur. Nasıl bir tasarım yapıyorsunuz bilemem ama örnekleri inceleyerek konu hakkında daha fazla fikir elde edilebilir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: atsract metod ve AbstractError

Mesaj gönderen ikra »

peki hocam temel sinifta bu metodu cagiramiyorsak, neden temel sinifta metodu tanitiyoruz?

bu su'na benzedi.

ben alisverise gidecegim, eve gelip aldiklarimi birakip mayomu alip yüzmeye gidecegim.
(abstract tanimlayarak) yola cikarken hem yanima pazar arabasini aliyorum, hem mayomu aliyorum.
pazara gidip alisveris yapiyorum, eve geliyorum, yüzmeye gidip mayoyu ancak havuzda kullaniyorum.
o halde neden mayoyu pazardan eve geldigimde almiyorumda, pazara giderken bosuna yanima yük ediyorum?

simdi aynisi abstract metod icin gecerli.
A sinifinda tanimladigim metodu ancak B sinifinda override ederek cagirabiliyorsam, o halde neden A sinifinda bosuna kendime yük ediyorum?

kurusa bakma, isin mantigini anlamaya calistigim icin bu sorulari soruyorum.
bazilari A sinifinda tanimlayip B sinifinda cagirabilmeyi mantik olarak tanimlamis, bazilari ise BUG olarak tanimlamis. (Kaynak: Internet)
kıdemsiz üye
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: atsract metod ve AbstractError

Mesaj gönderen sabanakman »

Burada yanlış bir anlaşılma oldu sanırım. Temel sınıfta da bu metod gayet hoş bir biçimde kullanılabiliyor. Yeter ki bunu kullanan nesne o temel sınıftan oluşturulmuş olmasın.

Kod: Tümünü seç

type
  TAritmetik=class
    function islem(a,b:Integer):Integer;virtual;abstract;
    function Hesapla:Integer;
  end;

  TTopla=class(TAritmetik)
    function islem(a,b:Integer):Integer;override
  end;

  TCikar=class(TAritmetik)
    function islem(a,b:Integer):Integer;override
  end;

  TCarp=class(TAritmetik)
    function islem(a,b:Integer):Integer;override
  end;

function TAritmetik.Hesapla:Integer;
begin
  Result:=islem(15,5);
end;

function TTopla.islem(a,b:Integer):Integer;
begin
  Result:=a+b;
end;

function TCikar.islem(a,b:Integer):Integer;
begin
  Result:=a-b;
end;

function TCarp.islem(a,b:Integer):Integer;
begin
  Result:=a*b;
end;
sınıfları bu şekilde düzenledikten sonra örnek olarak temel sınıftaki Hesapla metodunu kullanmak gerekirse

Kod: Tümünü seç

var a:TAritmetik;
begin
  if CheckBoxTopla.Checked then a:=TTopla.Create
  else if CheckBoxCikar.Checked then a:=TCikar.Create
  else if CheckBoxCarp.Checked then a:=TCarp.Create
  
  ShowMessage(IntToStr(a.Hesapla);

  a.free
end;
Burada hesapla metodu sadece temel sınıfa aittir ve bu da islem metodunu çağırır. Tabi oluşturulan nesneye göre bu metod farklı çalışacağı için seçime göre farklı sonuçlar verecektir. Yeterki

Kod: Tümünü seç

a:=TAritmetik.Create;
a.Hesapla;
şeklinde kullanılmasın. Çünkü TAritmetik sınıfında böyle bir metod (islem) abstract (soyut) olduğundan tanımlanmış her hangi bir kodu bulunmamaktadır.
En son sabanakman tarafından 03 Eyl 2012 08:44 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: atsract metod ve AbstractError

Mesaj gönderen ikra »

ellerine saglik. Allah (cc) razi olsun.
kıdemsiz üye
Cevapla