2011-07-04 17 views
5

Buradaki herkes Delphi'nin bir prosedür referansını nasıl temsil ettiğini biliyor mu? Biz "proc" in ne var TProc'nin dahili (bellek) gösterimi ve referanslar

var 
    proc: TProc; 
... 
proc = procedure begin beep end; 

örneğin

için

?

"Yöntem değişkeni" için bellek gösteriminin "yordam adresi" için 4 bayt olduğunu ve ardından "nesne adresi" için 4 bayt olduğunu, ancak "prosedüre başvurma" için biraz farklı olduğunu ve oldukça şekil veremediğini biliyorum dışarıda.

Bunun sebebi, kaynaklarla çalışmak istediğim eski bir kodun bulunmasıdır.

Bu konuda bir şey bilen var mı?

+1

http://alex.ciobanu.org/?p=27 –

+2

Bu sayede referans sayıldığından, yakalanan değişkenler hiçbir referans kalmayınca geri alınabilir. Referans ile çalışmak için nasıl uygulandığını bilmenize gerek yoktur. Bu yüzden bir derleyicin var. –

cevap

10

Yöntem referansları, yöntem referansı ile aynı imzası olan Invoke adlı tek bir yöntemle COM stili bir arabirim olarak uygulanır.

Yani TProc şuna benzer:

type 
    TProc = interface(IInterface) // so inherits QI, AddRef, Release 
    procedure Invoke; 
    end; 

Delphi C++ ürünle birlikte çalışabilirliği vardır gibi, sormak için geçerli bir soru. Önceden varolan bir referans sayılan tür ve deyim (COM yaşam boyu kuralları) kullanılarak, yöntem referans düzeyinde C++ ile birlikte çalışma mümkündür.

Anonim yöntemler, yöntem referans arabirimine, yani tam olarak aynı şekle, ancak aynı sembolik kimlikle değil, izomorfik bir arabirim uygulayan bir gizli sınıf oluşturur. Gizli sınıf, yöntem referans arayüzünü doğrudan uygulamamaktadır çünkü arayüzün birden çok kez uygulanması gerekebilir (tek bir blok, hepsi aynı yöntem referans tipindeki konumlara atanan birden çok anonim yöntem içerebilir). Özel bir derleyici oluşturulmuş arayüz değişkeni içinde genel olarak "prosedür referansı" tutulur.

+0

Bilmek güzeldi. Teşekkür ederim Barry Kelly. – Nedko

+1

@Barry: Her zamanki gibi ilginç! Son paragrafı birkaç kez okumam gerekiyordu, ama sanırım anlıyorum. Bu aptalca bir soru olabilir, korkarım, ancak: parantezli bölüm, bir yöntem referansı gizli sınıfının bir örneğinin birden fazla anonim yöntem uygulamak için yaratıldığı anlamına gelir, burada birkaçının tümü aynı normal prosedürde (veya aynı şekilde) tanımlanır. diğer kapsam) Bu sesler ... karmaşık :) –

+2

@David anonim yöntemleri yerel değişkenleri yakalayabilir; Aynı değişkeni yakalayan birkaç anonim yönteminiz olduğunda, durumu paylaşmaları gerekir. Delphi'nin uygulaması, bir blokta anonim yöntemlerle ilişkili tüm durumu (yani yakalanan değişkenleri) aynı nesneye koyar; Yakalanan her değişken bir alana dönüşürken, her anonim yöntem bu nesnenin sınıfındaki bir yönteme dönüşür. –