kendi adıma 5 soru sordum ama daha fazlasını aldım. cevaplar icin herkese tesekkur ederim ama bazi seyler daha henuz tam olarak yerine oturmadi. onun icin sorulara devam
sadettinpolat yazdı:
soru 1) Değişkeni neden delphi değilde ben nile atamak zorunda kalıyorum ?
poshet303 yazdı:
Yani bir nesne örneği hangi değişkenlerin kendine işaret ettiğini bilemez.
X:TEdit;X:=TEdit.Create;Y:=X;Z:=X;
Delphi şimdi hangisini nil yapsın.
bu soru gitti
sadettinpolat yazdı:
soru 2) Nesneyi yok etmek için neden destroy değilde free metodunu çağırmam gerekir ?
free, self <> nil kontrolu yaptigi icin destroya oranla daha güvenlidir tamam ama sonucta free metodu da nesnenin bir parçası değil mi ? hafizadan serbest birakilmis bir nesnenin free metodu nasil olurda access violatin hatasi vermeden duzgun calisabilir ? Derleyici statik metodlari ve sanal metodlari isletirken arka planda neler karistirir ?
Kod: Tümünü seç
procedure TForm1.Button2Click(Sender: TObject);
var
nesne:THede;
begin
nesne :=THede.Create;
nesne.Free;
nesne := nil;
nesne.Free;
//bu free uzayda mi durmaktadir ? nesnenin bir metodu degil midir
//ama nesne yok edilmistir...
end;
koddaki ikinci free cagrisi neden hataya yol acmaz ?
sadettinpolat yazdı:
soru 3) Free metodu statikken Destroy metodu neden sanal tanımlanmıştır ?
t-hex yazdı:
3.soru için : Nesnenin asıl destructor'u Destroy metodu olduğu için türetilen sınıflarda override edilebilsin diye virtual olarak tanımlanmış. Free metodu sadece self <> nil kontrolü yapacağı ve destructorı çağıracağı için statik kalmış.
bu da okeydir
sadettinpolat yazdı:
soru 4) Destroy metodunu çağırmak tehlikeliyse ve free metodu onun işini görüyorsa destroy metodu neden protected değilde public tanımlanmıştır ?
Baska bir problemle ugrasirken Constructor metodu gizlemeye calismistim. Metodu private ya da protected bolumde tanimlamak hic bir etki yapmadi. nereye yazarsam yazayım Create hep Public oluyordu. Destroy da aynıdır diye düşündüm ama Protected alanda tanımladığımda Destroy gizlenmişti. Nesne.Destroy yazamadım. Destroy gizlenebiliyorsa Public yerine Protested tanımlanabilir. Üstelik daha sonra üretilecek sınıflar eger arzu ederlerse Destroyu yine ezebilirler ve bu protected yokedici free metodu kullanılarak çağrılabilir ama nedense public tanımlanmış. Sanki bazı yerlerde free değilde Destroy çağırmak gerekliymiş gibi bir his veriyor insana...
coderlord yazdı:
Kod: Tümünü seç
Hede:= THede.Create; <-- Burada exception oluşursa?
try
finally
Hede.Free; <-- Hede yaratıldı mı ki?
end;
burayi tam olarak anlayamadim galiba. Yukaridaki kodda Create metodunda ortaya cikacak bir hata sonucu Hede.Free; satırı çalışır mı ?
THede.Create cagrisi try - finally blogu arasinda değil ki !
delphi ve oop konusunda ise bana gore pascal oop'u tam olarak destekler. bazi seyleri javadan farkli yapmasi pascalin tam olarak oop'u desteklemedigi manasina gelmez. Private alanlarin ayni unit icindeki diger nesneler tarafindan kullanilmasi bir avantajda olabilir yerine gore. Yok illa gormesin diyorsanız nesneleri ayrı ayrı unitlere koyabilirsiniz.
if self<> nil then gibi satırlar ise delphinin nesne referans modelinin bir sonucu. java da bir degiskeni deklare etmek onu yaratmak manasina gelir ama delphide once degiskeni tanimlarsiniz ardindan nesnenin yapilandiricisi cagrilarak degiskene nesnenin adresini atarsiniz.
bunlar oop tan ziyade biraz mimari konular bana gore, tipki java ve .net teki ki cop toplayici gibi.