Delphi'de Arayüzleri Tanımlama ve Uygulama

İçinde Delphi, "arayüz" iki farklı anlama sahiptir. İçinde OOP jargon, bir arabirimi, uygulaması olmayan bir sınıf olarak düşünebilirsiniz. Delphi birim tanımlamasında, bir birimde görünen kodların herkese açık bölümlerini bildirmek için kullanılır. Bu makale arayüzleri OOP perspektifinden açıklayacaktır.

Kodunuzun korunabilir, yeniden kullanılabilir ve esnek olacağı şekilde sağlam bir uygulama oluşturmak istiyorsanız OOP Delphi doğası rotanızın ilk% 70'ini sürmenize yardımcı olacaktır. Arayüzlerin tanımlanması ve uygulanması, kalan% 30'a yardımcı olacaktır.

Soyut Sınıflar

Bir arabirimi soyut bir sınıf olarak düşünebilirsiniz ve tüm uygulamalar elenmiştir ve herkese açık olmayan her şey kaldırılmıştır. Soyut bir sınıf Delphi somutlaştırılamayan bir sınıftır - soyut olarak işaretlenmiş bir sınıftan nesne oluşturamazsınız.

Örnek bir arayüz bildirimine bakalım:

tip
IConfigChanged = arayüz[ '{0D57624C-CDDE-458b-A36C-436AE465B477}']
prosedür ApplyConfigChange;
son;

IConfigChanged bir arayüzdür. Bir arabirim bir sınıfa çok benzer, "sınıf" yerine "arabirim" anahtar sözcüğü kullanılır. İnterface anahtar sözcüğünü izleyen Guid değeri, derleyici tarafından arabirimi benzersiz olarak tanımlamak için kullanılır. Yeni bir GUID değeri oluşturmak için Delphi IDE'de Ctrl + Shift + G tuşlarına basın. Tanımladığınız her arayüz benzersiz bir Rehber değerine ihtiyaç duyar.

instagram viewer

OOP'taki bir arabirim, arabirim tarafından tanımlanan yöntemleri uygulayacak bir soyutlama (gerçek bir sınıf için arabirimi uygulayacak bir şablon) tanımlar. Bir arayüz aslında hiçbir şey yapmaz, sadece diğer (uygulayan) sınıflar veya arayüzlerle etkileşim için bir imzası vardır.

Yöntemlerin (fonksiyonlar, prosedürler ve özellik Get / Set yöntemleri) uygulanması, arabirimi uygulayan sınıfta yapılır. Arayüz tanımında, kapsam bölümleri (özel, genel, yayınlanmış vb.) Yoktur, her şey herkese açıktır. Bir arabirim türü işlevleri, yordamları (sonunda arabirimi uygulayan sınıfın yöntemleri haline gelecektir) ve özellikleri tanımlayabilir. Bir arabirim bir özelliği tanımladığında, get / set yöntemlerini tanımlaması gerekir - arabirimler değişkenleri tanımlayamaz.

Sınıflarda olduğu gibi, bir arabirim diğer arabirimlerden miras alabilir.

tip
IConfigChangedMore = arayüz(IConfigChanged)
prosedür ApplyMoreChanges;
son;

Programlama

Çoğu Delphi geliştiricisi arabirimleri düşündüklerinde COM programlamayı düşünüyorlar. Ancak, arayüzler sadece dilin bir OOP özelliğidir - özel olarak COM'a bağlı değildir. Arabirimler COM'a hiç dokunmadan Delphi uygulamasında tanımlanabilir ve uygulanabilir.

uygulama

Bir arabirimi uygulamak için, aşağıdaki gibi sınıf ifadesine arabirimin adını eklemeniz gerekir:

tip
TMainForm = sınıf(TForm, IConfigChanged)
halka açık
prosedür ApplyConfigChange;
son;

Yukarıdaki kodda "MainForm" adlı bir Delphi formu IConfigChanged arabirimini uygular.

Uyarı: bir sınıf bir arabirim uyguladığında tüm yöntemlerini ve özelliklerini uygulamalıdır. Bir yöntemi (örneğin: ApplyConfigChange) uygulamayı başarısız / unutursanız, derleme zamanı hatası "E2003 Bildirilmeyen tanımlayıcı: 'ApplyConfigChange'" gerçekleşecek.
Uyarı: GUID değeri olmayan arabirimi belirtmeye çalışırsanız, aşağıdakileri alırsınız: "E2086 'IConfigChanged' türü henüz tam olarak tanımlanmadı".

Misal

Bir defada kullanıcıya birkaç formun görüntülenebileceği bir MDI uygulaması düşünün. Kullanıcı uygulama yapılandırmasını değiştirdiğinde, çoğu formun ekranını güncellemesi gerekir; bazı düğmeleri göster / gizle, etiket başlıklarını güncelleyin vb. Tüm açık formları uygulama yapılandırmasında bir değişiklik olduğunu bildirmek için basit bir yola ihtiyacınız olacaktır. İş için ideal araç bir arayüzdü.

Yapılandırma değiştiğinde güncellenmesi gereken her form IConfigChanged uygulamasını uygular. Yapılandırma ekranı kalıcı olarak görüntülendiğinden, bir sonraki kod kapatıldığında tüm IConfigChanged uygulama formlarının bildirilmesini ve ApplyConfigChange çağrılmasını sağlar:

prosedür DoConfigChange ();
var
cnt: tam sayı;
icc: IConfigChanged;
başla
için cnt: = 0 için -1 + Ekran. FormCount yapmak
başla
Eğer Destekler (Ekran. Formlar [cnt], IConfigChanged, icc) sonra
icc. ApplyConfigChange;
son;
son;

Destekler fonksiyon (Sysutils.pas dosyasında tanımlanmıştır), belirli bir nesnenin veya arabirimin belirli bir arabirimi destekleyip desteklemediğini gösterir. Kod Ekran boyunca yinelenir. Form koleksiyonu (TScreen nesnesinin) - uygulamada o anda görüntülenen tüm formlar. Bir form varsa Ekran. Formlar [pulse] arabirimi destekler, Destekler son parametre parametresi için arabirimi döndürür ve true değerini döndürür.

Bu nedenle, form IConfigChanged öğesini uygularsa, icc değişkeni, form tarafından uygulanan arabirimin yöntemlerini çağırmak için kullanılabilir. Elbette, her formun sahip olabileceğini unutmayın. kendi farklı ApplyConfigChange yordamı uygulaması.

Atalar

Delphi'de tanımladığınız herhangi bir sınıfın bir ataya sahip olması gerekir. TObject, tüm nesnelerin ve bileşenlerin nihai atasıdır. Yukarıdaki fikir arabirimler için de geçerlidir, IInterface tüm arabirimler için temel sınıftır. IInterface 3 yöntem tanımlar: QueryInterface, _AddRef ve _Release.

Bu, IConfigChanged'ımızın bu 3 yöntemi de içerdiği, ancak bunları uygulamadığımız anlamına gelir. Bunun nedeni TForm'un IInterface'i sizin için zaten uygulayan TComponent'ten miras almasıdır! TObject öğesinden devralınan bir sınıfa arabirim uygulamak istediğinizde, sınıfınızın bunun yerine TInterfacedObject öğesinden miras aldığından emin olun. TInterfacedObject IInterface uygulayan bir TObject olduğu için. Örneğin:

TMyClass = sınıf(TInterfacedObject, IConfigChanged)
prosedür ApplyConfigChange;
son;

Sonuç olarak, IUnknown = II arabirim. IUnknown, COM içindir.