Interface ve Türetmeler

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ü

Interface ve Türetmeler

Mesaj gönderen ikra »

Kod: Tümünü seç

ISafe = Interface
  procedure Lock;
  procedure UnLock;
end;

TCache = class
public
  procedure xyz;
end;

TQueue = class(TCache, ISafe)
private
  FSafe: TCriticalSection;
public
  procedure abc;
  procedure Lock;
  procedure UnLock;
end;
görüldügü gibi TCache'de CriticalSection'a ihtiyacim olmadi, bir alt sinifta ihtiyacim oldu.
bunun gibi bir cok class birbirlerinden türeyecek olursa, her defasinda TCriticalSection'un ihtiyac oldugu yerde yeni bastan tanimlayip create etmek mi daha uygun düser, yoksa TCache'de Lock prosedürünü kullanmadigim halde

Kod: Tümünü seç

TSafe = class(TInterfacedObject, ISafe)
private
  FSafe: TCriticalSection;
public
  procedure Lock;
  procedure UnLock;
end;

TCache = class(TSafe)
public
  procedure xyz;
end;

TQueue = class(TCache)
public
  procedure abc;
end;
seklinde tanimlama yapip diger tüm class'lari TSafe'den mi türetsem daha uygun olur?
CriticalSection'a ihtiyacim olmayan bir Class'i CriticalSection'u barindan bir class'dan türetmek ne kadar mantikli?
CriticalSection'u her ihtiyac duydugum alt siniflarda tekrardan tanitmak ne kadar mantikli?
kıdemsiz üye
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Interface ve Türetmeler

Mesaj gönderen thelvaci »

Ata sınıftaki metodlar tüm alt sınıflar için anlam ifade etmiyor ise mantıken ata sınıfta tanımlanmamaları gerekir. Bu durumda ata sınıfı olduğu gibi bırakıp; ata sınıftan türeyen Lock ve Unlock metodlarını implemente eden bir başka ara sınıf tanımlayabilir ve Lock/Unlock metodlarına ihtiyacı olan sınıfları bu ara sınıftan türetmek daha manidardır. Aksi durumda OOP'nin mantığına uymayan bir yapı oluşur. Hiyerarşiyi genişletmekten çekinmeyelim, aksi durumda türetilmiş sınıfların hiç ihtiyacı olmayan metodların ata sınıflarda biriktiğini gözlemlemeye başlarız ilerledikçe.
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Interface ve Türetmeler

Mesaj gönderen ikra »

Tugrul abi, sorun burada basliyor.
TCache'de Lock'a ihtiyacim yok fakat TCache den türeyen TQueue'de ihtiyacim var. Iki Class'i birbirine baglayip multi inheritance yapamadigim icin isin mantik kisminda kilitlenmis durumdayim.
ISafe isminde bir interface ile bu isi halledebilirim fakat bu sefer her implement ettigim ISafe icin TCriticalsection'u yeniden create etmek zorundayim. Lock ve UnLock prosedürlerini yeniden tanimlamak zorundayim. Bu da kullanim acisindan hic hos bir durum degil.
Bu yalnizca iki Class ile sinirli degil. Daha birbirlerinden türetmem gereken bir cok Class mevcut.
kıdemsiz üye
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Interface ve Türetmeler

Mesaj gönderen thelvaci »

Ben de diyorum ki;

Kod: Tümünü seç

  TCustomClass = class
  // tüm çocuk sınıflarda kullanılması gereken metodlar buraya
  end;
  
  TLockable = class(TCustomClass)
  // Locking / Unlocking kodları buraya
  procedure Lock; virtual;
  procedure Unclock; virtual; 
  end;
  
  TLockableChild = class(TLockable)
  // gerekir ise özelleştirilebilir lock/unlock metodları burada override edilebilir.
  end;
  
  TUnlockableChild = class(TCustomClass)
  end;
  
gibi bir yapıda, ata sınıf TCustomClass ve bu sınıftan türeyen tüm sınıfların ihtiyaçlarını karşılamalı. Türemiş sınıflardan bazılarının lock/unlock özelliklerine ihtiyacı var ise TLockableChild'ı; ihtiyacı yok ise TUnlockableChild sınıfını kullanmak gerekir.Tabii tasarım değiştirilebilir, ihtiyacı en iyi sen bilebilirsin. Ama araya başka ara sınıflar koymaktan çekinmemek lazım ;)
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Interface ve Türetmeler

Mesaj gönderen thelvaci »

Ayrıca belirtmem lazım ki; geniş kapsamlı bir sınıf hiyerarşisini oluşturmadan önce ne kadar kağıt üzerinde tasarımını da yapsanız; geliştirme sırasında karşılaşılabilecek problemlerden ötürü, yapı her daim değişikliğe uğrayabilir. Bu nedenler ile ben mümkün mertebe araya katman sınıflar eklerim ve elbette interface'lerden de faydalanırım. Uygulamanın ilerleyen aşamalarında tasarımda bir arıza tespit etti iseniz, tasarımı mevcut duruma göre gerekir ise yeniden yapmaktan asla imtina etmem. OOP metodolojisi bu şekilde gelişip bir meleke halini alıyor çünkü.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Interface ve Türetmeler

Mesaj gönderen thelvaci »

Kısaca; OOP'deki en önemli özellik şudur: "Bir sınıf asla kendisinden beklenenden fazlasına hizmet etmemelidir".
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Interface ve Türetmeler

Mesaj gönderen ikra »

Yani sonuc olarak bir class yazip daha sonra bunun bir de lockable classini yazacagim. Her halukarda criticalsection'u herr lockableclass icin silbastan create etmem ve lock/unlock prosedürlerini tanitmam gerekiyor.
kıdemsiz üye
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Interface ve Türetmeler

Mesaj gönderen thelvaci »

ikra yazdı:Yani sonuc olarak bir class yazip daha sonra bunun bir de lockable classini yazacagim. Her halukarda criticalsection'u herr lockableclass icin silbastan create etmem ve lock/unlock prosedürlerini tanitmam gerekiyor.
Neden ? Ata sınıfta tanımlanmış olan nesneler, özellikler, metodlar vb. alt sınıflarca da kullanılabilir.
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Re: Interface ve Türetmeler

Mesaj gönderen ikra »

Yanlis anlasilma var. Elbetteki ata sinifta tanimlanan metodlar alt siniflarda da kullanilabilinir. Benim anlatmak istedigim sey farkli. Melez bir class türetemedigim icin iki secenekten birini kullanmak zorundayim.

1) her bir sinifin bir de lockable sinifini türetip lock'a ihtiyac duydugum tüm siniflari da bu siniftan türetmeliyim. Yani her sinif icin bir alt sinif tanimlamaliyim ve bu alt siniflarin icerisinde criticalsection create etmeliyim.

2) her bir sinifi o an lock'a ihtiyac duymasam dahi alt siniflarda ihtiyac olacagi icin en bastan lockable olarak hazirlayip tüm siniflari da bu siniftan türetmeliyim. Yani en ata sinifta ihtiyac olmadigi halde criticalsection create etmeliyim.

Bu baglamda interface'ler ihtiyacim olan yapiya cevap vermiyor.
kıdemsiz üye
Cevapla