- Tiplerin Kapsüllenmesi ve Genişletilebilirliği
- Kalıtım
- Polimorfizm
- Aşırı Yükleme
- Sanal Fonksiyonlar
- Bir Sınıfın Statik Elemanları
- Fonksiyon Şablonları
- Şablon avantajları
- Soyut Sınıflar
Sanal Fonksiyonlar
'virtual' (sanal) anahtar kleimesi bir fonksiyon belirtecidir. Temel ve türetik sınıfların fonksiyonları arasından uygun bir fonksiyon üyesinin, çalışma sırasında dinamik olarak seçilmesini sağlayan bir mekanizma sunar. Yapılar sanal fonksiyonlara sahip olamazlar. Bu sadece fonksiyon üyeleri için yapılacak bildirimleri değiştirmek için kullanılır.
Sanal fonksiyonlar tıpkı sıradan fonksiyonlar gibi bir çalıştırılabilir gövdeye sahip olmalıdır. Çağrıldığında anlamsallığı diğer fonksiyonlarla aynıdır.
Sanal fonksiyonlar türetik sınıflarda geçersiz olabilir. Sanal fonksiyon için hangi fonksiyon tanımının çağrılması gerektiğine dinamik olarak (çalışma sırasında) karar verilir. Temel sınıfın bir sanal fonksiyon içermesi ve türetik sınıfların da bu fonksiyonun kendilerine özgü versiyonlarını içermeleri tipik bir durumdur.
Temel sınıf işaretçisi bir temel sınıf nesnesini veya bir türetik sınıf nesnesini gösterebilir. Çağrılacak üye fonksiyonun seçimi çalışma sırasında gerçekleştirilir. Bu seçim işaretçi tipine değil nesne tipine bağlıdır. Bir türetik sınıfın hiç üyesi yoksa, varsayılan olarak temel sınıfın sanal fonksiyonu kullanılır.
Yıkıcılar, virtual anahtar sözcüğü ile bildirilmiş olduklarına bakılmaksızın, daima sanaldır.
MT5_Tetris.mq5 örneğindeki kullanımı inceleyelim. Temel sınıf CTetrisShape, 'Draw' sanal fonksiyonuyla birlikte, dahil edilmiş MT5_TetrisShape.mqh dosyasında tanımlanmıştır.
Daha sonra her bir türetik sınıf için bu fonksiyon türetik sınıfın niteliklerine göre uygulanır. Örneğin ilk şekil CTetrisShape1, Draw() fonksiyonunun kendine has uygulamasına sahiptir:
Kare şekli, CTetrisShape6 aracılığı ile tarif edilmiştir ve Draw() yönteminin kendine has bir uygulamasına sahiptir:
Oluşturulan nesneyi içeren sınıfa bağlı olarak, şu veya bu türetik sınıfın sanal fonksiyonu çağrılır.
'override' Şekillendiricisi #
'override' şekillendiricisi ile bildirilen fonksiyonlar, ebeveyn sınıf yönteminin etkisiz kılınmasını sağlar. Bu tekniğin kullanılması, ilgili hataların önlenmesini sağlar. Örneğin, yöntem işaretinin yanlışlıkla değiştirilmesini önleyebilir. 'func' yönteminin temel sınıf bünyesinde kullanıldığını düşünelim ve yöntem, argüman olarak int tipli bir değişken içersin:
Sonra yöntem çocuk sınıf içinde geçersiz kılınsın:
Görüldüğü gibi, argümandaki 'int' tipi 'short' tipiyle yanlışlıkla değiştirildi. Aslında burada geçersiz kılma işlemi değil, aşırı yükleme işlemi yapıldı. Yani, aşırı yüklenmiş fonksiyon tanımlama algoritmasına göre hareket edildiğinde, belli durumlarda derleyici temel sınıf yöntemini aşırı yüklenmiş yönteme tercih edecektir.
Bu tip hataları önlemek için, ilgili yönteme açık şekilde 'override' şekillendiricisini eklemeniz gerekir.
Yöntemin işareti geçersiz-kılma sırasında değiştirilirse, derleyici ebeveyn sınıfta aynı işarete sahip bir yöntem bulamaz ve hata verir:
'final' Şekillendiricisi #
'final' şekillendiricisi tamamen aksi yönde çalışır ve yöntemin çocuk sınıf içinde geçersiz kılınmasını engeller. Bir yöntemin tamamen yeterli olduğundan eminseniz, daha sonradan değiştirilmemesi için yöntemi 'final' şekillendiricisi ile bildirin.
Yöntemi yukarıdaki örnekte gösterildiği gibi 'final' şekillendiricisi ile etkisiz kılmak istediğinizde derleyici hata dönüşü yapar:
Ayrıca bakınız