June 03, 2013

Yanlış yazmışım: scope değil, scoped demek istedim.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 03, 2013

virtual, üst tür (veya arayüz) aynı olduğu halde alt türe uygun olarak davranan işlevdir. NYP'nin olmazsa olmaz olanaklarından birisidir.

import std.stdio;

interface Hayvan
{
   void sesÇıkart();
}

class Kedi : Hayvan
{
   void sesÇıkart()
   {
       writeln("miyav");
   }
}

class Köpek : Hayvan
{
   void sesÇıkart()
   {
       writeln("hav");
   }
}

/*
* Hayvan.sesÇıkart sanal bir işlevdir çünkü bu işlevin parametresi Hayvan
* olduğu halde, sesÇıkart() işlevi asıl türe uygun olarak davranır.
*/
void foo(Hayvan hayvan)
{
   hayvan.sesÇıkart();
}

void main()
{
   foo(new Kedi);
   foo(new Köpek);
}

Çıktısı:
'miyav
hav'

Daha önce konuştuğumuzu özetlersek: D'de 'final' olarak işaretlenmeyen sınıf üye işlevleri hep 'virtual'dır. C++ ve D bu konuda terstir.

  • C++'ta varsayılan, sıradan üye işlevdir; 'virtual' anahtar sözcüğüyle tanımlanırsa sanal olur.

  • D'de varsayılan, sanal işlevdir; 'final' anahtar sözcüğüyle tanımlanırsa sıradan üye işlev olur.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 04, 2013

Alıntı (Salih Dinçer):

>

bir derleme zamanı olanağı gibi geldi bana...:)

Tam tersine. Bütünüyle çalışma zamanı olanağıdır. Derleme zamanı olanağı olarak şablonlar ve işlev yükleme (overload) var. Bu ikisi de değil. Burada çağrı nesnenin vtbl göstergesi üzerinden bulunan işlev göstergesine yapılır.

Alıntı:

>

Basit olmayan ve çalışma zamanında virtual'ın faydasını ve/veya yavaşlığını (adrese ulaşmak için 2 kere dallanma yapıldığını) gösteren bir örnek daha rica edebilir miyim?

Aynı örneğin main'ini şöyle değiştirirsek Hayvan'ın derleme zamanında bilinmediğini görürüz:

void main(string[] parametreler)
{
   Hayvan hayvan =
       cast(Hayvan)((parametreler.length % 2) ? new Kedi : new Köpek);

   foo(hayvan);
}

(Oradaki cast'e gerek olmasına inanamıyorum. Bir derleyici hatası veya eksikliği olmalı. Üçlü işlecin dönüş ifadelerinin ikisinin ortak atası Hayvan olduğundan cast'e gerek olmadan derlenmesi gerekir.)

Şuradaki Tren örneği de olabilir:

http://ddili.org/ders/d/tureme.html

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 04, 2013

Alıntı (acehreli):

>

Oradaki cast'e gerek olmasına inanamıyorum.

Aynı soruyu bir yerden hatırlıyorum. Daha önce sormuşum bile: :)

http://forum.dlang.org/thread/htf22g$2kvn$1@digitalmars.com

Üçlü işleç sağ taraftaki iki ifadenin atasını buluyor ama bunu yaparken Object dalını tercih ediyor (Object, her sınıfın otomatik atası).

Yani aslında elimizde aşağıdaki gibi bir türeme durumu var. Kedi ve Köpek hem Hayvan'dan türemiş durumdalar hem de Object'ten:
'
(interface) (class)
Hayvan Object
| \ / |
| / |
| /\ |
| / \ |
Kedi Köpek
'
Üçlü işleç class dalını yeğliyor ve Kedi ile Köpek'in atası olarak Object'i buluyor. cast(Hayvan)'a o yüzden gerek var; derleyici hatası değil.
Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 04, 2013

Alıntı (acehreli):

>

Alıntı (Salih Dinçer):

>

bir derleme zamanı olanağı gibi geldi bana...:)

Tam tersine. Bütünüyle çalışma zamanı olanağıdır. Derleme zamanı olanağı olarak şablonlar ve işlev yükleme (overload) var. Bu ikisi de değil. Burada çağrı nesnenin vtbl göstergesi üzerinden bulunan işlev göstergesine yapılır.
Hocam VTBL diye bir şey var ama olay çok çok farklı. Her şey derleme zamanında biliniyor. Bu göründüğü gibi olmayan bir şey. Sanrım konu çok çok uzayacak. Dehşet bir olay, çok fena...:)

http://ddili.org/forum/thread/1179

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 04, 2013

Alıntı (zekeriyadurmus):

>

Uzun zamandır bir şeyler okumuyorum beynim algıda daha da tembelleşmiş

Hemen kendini suçlama. Okuduğun kitap yetersiz olmasın? ;) Lütfen anlaşılmayan bölümleri bana bildirin; basit bir cümle değişikliği bile bütün karışıklığı giderebilir.

Alıntı:

>

sınıf yapılarının çalışma mantığını detaylıca anlatan bir kaynağınız var mı

Aklımda yok ama vtbl, virtual function table, virtual function, vs. diye aratılabilir.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 04, 2013

Alıntı (acehreli):

>

Alıntı (Salih Dinçer):

>

Her şey derleme zamanında biliniyor.

"Herşey" olamaz herhalde... :) Görüldüğü gibi, hangi hayvanın sesinin çıktığı programın parametreleri tarafından belirleniyor. Programın parametreleri derleme zamanında nasıl bilinsin?

Ali

Evet, inanmayacaksın ama her şey statik!

Tamam, kabül...

Test ve Jump komutları ile olasılıklar kümesi mevcut. Ama derleyici, bir sınıf için bellekten yeni bir adres talep etmek (_d_newclass) dışında dinamik bir kod üretmiyor. Biz foo() işlevine, 2 farklı sınıf göndersek de D programlama dilinin kurallarını ihlal etmediğimiz müddetçe EAX'a atılmış offset değeri nereyi işaret ediyorsa (aynı zamanda ESP'de şekillendiriliyor!) program oradan çalışmaya (statik verileri yüklemeye) devam ediyor.
Alıntı:

>
  mov	EAX,offset FLAT:_D9interface4Kedi7__ClassZ@SYM32
  push	EAX
  call	  _d_newclass@PC32 '; auto kedi = new Kedi();'
  add	ESP,4
  test	EAX,EAX
  je	L1A
  lea	EAX,8[EAX]
  jmp short	L1C

L1A: xor EAX,EAX
L1C: call _D9interface3fooFC9interface6HayvanZv@PC32 '; foo(kedi);'

Özetle bu bir büyü. Biz bu büyünün kuralları içerisinde top koşturuyoruz. Aslında bu başlıkta tartışığımız örnek süslü bir şekilde ekrana 2 satır yazı yazmakta. Sadece gittiği yollar biraz dolambaçlı. Anlatabildim mi bilmiyorum ama bunlar sanal şeyler. Bunlar sadece dil olanakları, kuralları.

Sevgiler, saygılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 04, 2013

Alıntı (Salih Dinçer):

>

Her şey derleme zamanında biliniyor.

"Herşey" olamaz herhalde... :) Görüldüğü gibi, hangi hayvanın sesinin çıktığı programın parametreleri tarafından belirleniyor. Programın parametreleri derleme zamanında nasıl bilinsin?

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

1 2
Next ›   Last »