private kalıtımı (private inheritance) – 2

private kalıtımının kullanım senaryolarına daha önceki yazımızda değinmiştik. private kalıtımının public kalıtımından farklı olarak “is a” ilişkisini temsil etmediğini “has a” ilişkisini gerçeklemenin başka bir yolu olarak kullanıldığını biliyoruz. Ancak öyle bir durum var ki private kalıtımı yine “is a” ilişkisi için kullanılıyor. Buna popüler olarak kısıtlı ya da konrollü çok biçimlilik deniyor. Bazı durumlarda çalışma zamanı çok biçimliliğinden yalnızca seçilmiş belirli işlevlerin faydalanmasını ve bu aracın diğer işlevlere kapatılmasını istiyoruz. Aşağıdaki kodu inceleyelim:

Der sınıfı public kalıtımıyla Base sınıfından oluşturulmuş ve taban sınıfın sanal vfunc işlevini ezmiş (override etmiş). Global gfunc işlevi Base nesnelerini çokbiçimli (polimorfik) olarak kullanıyor. Şimdi amacımızın şunu sağlamak olduğunu düşünelim: Yalnızca foo1 işlevi çokbiçimilikten faydalansın fakat diğer işlevler, örneğin foo2 işlevi, bu yapıdan faydalanamasın. Yukarıdaki kodda hem foo1 işlevinde hem de foo2 işlevinde gfunc işlevine Der türünden nesnelerle yapılan çağrılar geçerli. Oysa biz foo2 işlevine (ve muhtemelen bazı başka işlevlere) kalıtımla elde edilmiş Der sınıf nesnelerinin gönderilmesini geçersiz kılmak istiyoruz.
Reçete hazır: Der sınıfı Base sınıfından private kalıtımıyla oluşturulsun ve çokbiçimlilikten faydalanacak işlevlere arkadaşlık (friend) versin. private kalıtımında türemiş sınıftan (child class) taban sınıfa (Base class) otomatik (implicit) tür dönüşümlerinin yalnızca türemiş sınıfların kodlarına ve bu sınıfların arkadaşları olan kodlara tanınan bir hak olduğunu hatırlayalım:

Bu kez Der sınıfı Base sınıfından private kalıtımıyla oluşturuldu. Der sınıfı yine Base sınıfının sanal işlevini eziyor. Kalıtımın private olmasının taban sınıfın sanal işlevlerini ezmeye engel olmadığını hatırlayalım. Der sınıfı artık çokbiçimlilikten faydalanacak işlevelere arkadaşlık verebilir. Der sınıfı içinde yapılan

bildirimiyle foo1 işlevine arkadaşlık veriliyor. Der sınıfınına arkadaş olan işlevlerin Der sınıfından Base sınıfına dönüşüm izninin olduğunu diğer işlevlerin bu hakka sahip olmadığıni biliyoruz. foo1 işlevinde yapılan

çağrısı geçerli iken foo2 işlevi içinde yapılan aynı çağrı geçerli değil.

Necati Ergin

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

Bunlar da ilginizi çekebilir

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kod Eklemek İçin Okuyun