saf sanal işlevlerin tanımlanması – 2

Bir taban sınıfın (saf olmayan) sanal işlevleri kalıtımla elde edilecek sınıflara hem bir arayüz hem de varsayılan bir kod sağlar. Kalıtımla elde edilecek sınıf, kendi tercihine göre taban sınıfın sanal işlevinin kodunu tercih edebileceği gibi, bu işlevi ezerek (override) kendi kodunu da sağlayabilir. Sık yapılan hatalardan biri, türemiş sınıfın böyle bir işlevi ezmeyi ihmal etmesi ve istemeden varsayılan koda razı olması. Oysa taban sınıfın bir saf sanal işlevinin somut olması gereken sınıflar tarafından ezilmesi zorunlu. Taban sınıf  varsayılan kod sağlayacağı bir işlevi sanal yapmak yerine saf sanal yaparak varsayılan kod ile tanımlayabilir. Böylece somut olacak türemiş sınıflar bu işlevi ezmek zorunda kalacaklar. Yani türemiş sınıfların varsayılan kodu istemeleri durumunda taban sınıfın saf sanal işlevini fiilen çağırmaları gerekecek.

Yukarıdaki kodda Fighter sınıfının sleep, move ve attack işlevleri sanal. Bu işlevler Fighter sınıfından kalıtım yoluyla elde edilecek somut sınıflara hem arayüz hem de varsayılan bir gerçekleştirim (implementation) sunuyor. Fighter sınıfından kalıtım yoluyla elde edilen NinjaFighter sınıfı sleep ve move işlevlerini ezerken attack isimli sanal işlevi ezmemiş. Bu durumda bir Fighter referansı ya da göstericisi ile attack işlevi çağrıldığında nesnenin dinamik türü NinjaFighter olsa da Fighter sınıfının kodu çalışacak. Şimdi de aşağıdaki koda bakalım:

Bu kez Fighter sınıfının işlevleri saf sanal yapılarak sınıfın protected bölümüne koyuldu. Bu işlevler muhtemelen Sanal Olmayan Arayüz (Non Virtual Interface) örüntüsüyle muhtemelen taban sınıfın sanal olmayan üye işlevleri tarafından çağrılacaklar. NinjaFighter sınının somut olabilmesi için yani bu sınıf türünden nesnelerin tanımlanabilmesi için NinjaFighter sınıfının Fighter sınıfının tüm saf sanal işlevlerini ezdiğini görüyorsunuz. NinjaFighter sınıfı sleep ve move işlevleri için kendi kodunu sağlarken attack işlevi için taban sınıfı olan Fighter sınıfının attack işlevini çağırıyor. Böylece varsayılan kodu kabullenmiş oluyor. Sınıfların üye işlevleri içinde :: çözünürlük işleci ile yapılan çağrıların çalışma zamanı çok biçimliliğine tabi tutulmadığını anımsayın. Bu yüzden

özyinelemeli bir çağrı değil.

Share

Necati Ergin

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

Bunlar da ilginizi çekebilir

Kod Eklemek İçin Okuyun