sanal olmayan arayüz (non virtual interface)

Tipik olarak programcılar, kalıtımda kullanılacak taban sınıfları oluştururken hem arayüzü (interface) hem de türemiş sınıflar tarafından özelleştirilebilecek davranışları belirleyen sanal işlevleri sınıfın public bölümüne koyuyorlar:

Arayüzde bildirilen işlevler sanal ya da saf sanal olabilir. Saf sanal olmaları durumunda tanımlanabilir ya da tanımlanmayabilirler. Böyle bir arayüzde bildirilen işlevler aynı zamanda iki ayrı görevi yerine getiriyorlar:
i) sınıfın public bölümünde bildirildiklerinden sınıfın public arayüzünü belirliyorlar yani arayüzün bir bileşeni durumundalar.
ii) Sınıfın gerçekleştirilmesine dair de bir bilgi veriyorlar. Türemiş sınıflar bu işlevleri ezerek taban sınıfın davranışını ezebilir ya da kendi davranışlarını belirleyebilirler.
Bir public işlevin birbirinden farklı bu iki farklı görevi yerine getirmesi farklı kaygıların bir arada ele alınması sonucunu doğuruyor ve farklı bir yaklaşım ihtiyacı doğuruyor.

What if we want to separate the specification of interface from the specification of the implementation’s customizable behavior?
Then we end up with something that should remind us strongly of the Template Method pattern[2], because that’s exactly what it is:
[Later note: Actually it’s a more restricted idiom with a form similar to that of Template Method.
This idiom deserves its own name, and since writing this article I’ve switched to calling the idiom the
Non-Virtual Interface Idiom, or NVI for short. -hps]

Sanal Olmayan Arayüz kod yapısı (Non Virtual Interface Idiom) bence C++ dilinin en önemli kod yapılarından biri. Bu idiyom bir taban sınıfın sanal işlevlerinin public olması yerine private ya da protected yapılmasına, taban sınıfın tüm public arayüzünün sanal olmayan işlevler ile oluşturulmasına dayanıyor. Eğer taban sınıfın bir sanal işlevi türemiş sınıflar tarafından çağrılmayacaksa sınıfın private öğesi, türemiş sınıflar tarafından çağrılacak ise sınıfın protected öğesi yapılıyor. Sınıfın public arayüzünde yalnızca sanal olmayan işlevler bulunuyor.

Peki taban sınıfın public arayüzünde bulunan işlevlerin sanal olmaması, sanal işlevlerin sınıfın private ya da protected bölümüne kaydırılması ne gibi avantajlar sağlıyor?

Share

Necati Ergin

C ve Sistem Programcıları Derneğinde eğitmen olarak çalışıyor.

Bunlar da ilginizi çekebilir

Kod Eklemek İçin Okuyun
Eklemek istediğiniz kodları lütfen aşağıdaki “pre” kodları arasında yazınız.
<pre class="lang:c++ decode:true ">
--yazacağınız kodlar--
</pre>
(buradan kopyalayarak kullanabilirsiniz)