- 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
Fonksiyon Şablonları
Aşırı-yüklenmiş fonksiyonlar genellikle benzer işlemleri gerçekleştirmek için kullanılır. ArraySize(), MQL5 içinde böyle bir fonksiyona örnektir. Herhangi bir dizinin büyüklüğüne dönüş yapar. Gerçekte bu sistem fonksiyonu aşırı yüklenmiştir ve bu aşırı-yükleme uygulamasının tamamı MQL5 yazılım geliştiricilerinden saklanmıştır:
int ArraySize(
|
Yani MQL5 derleyicisi, fonksiyon çağrıldığında gerekli olanı yapacaktır. Örnek olarak, bunun tamsayı tipli diziler için nasıl yapılabileceğini gösterelim:
int ArraySize(
|
ArraySize() fonksiyonu, tarihsel veri şeklindeki kotasyonlarla çalışabilmek amacıyla, MqlRates tipi bir dizi ile şu şekilde gösterilebilir :
int ArraySize(
|
Bu şekilde, farklı tipteki verilerle çalışmak için aynı fonksiyonu kullanmak çok uygun bir seçenek haline gelir. Ama bunun için tüm ön çalışma yapılmış olmalıdır. İlgili fonksiyon, doğru şekilde çalışması gereken tüm veri tipleri için aşırı-yüklenmiş olmalıdır.
Uygun bir çözüm vardır. Benzer işlemlerin tüm veri tipleri için çalıştırılması gerekiyorsa fonksiyon şablonları kullanılabilir. Programcı sadece bir fonksiyon şablonu tarifi yazmalıdır. Şablonu tarif ederken fonksiyonun birlikte çalışması gereken kesin veri tipleri yerine, sadece bazı biçimsel parametreleri tanımlamalıyız. Derleyici, tüm tiplerin doğru işlenmesi için, fonksiyon çağrısında kullanılan argümanların tiplerini temel alarak, otomatik olarak çeşitli fonksiyonlar oluşturur.
Fonksiyon şablonu tanımı template anahtar kelimesi ile başlar ve açı parantezler arasındaki biçimsel parametrelerin listesi ile devam eder. Biçimsel parametreler typename anahtar kelimesinden sonra gelir . Biçimsel parametreler sistemde gömülü veya kullanıcı tanımlı tiplerdir. Şu amaçlarla kullanılırlar:
- fonksiyon argümanlarının tiplerini belirtmek,
- fonksiyonun dönüş tipini belirtmek,
- değişkenleri fonksiyon tanımında bildirmek
Şablon parametrelerinin sayısı sekizi geçemez. Şablon tanımındaki biçimsel parametreler en az bir kere fonksiyon parametreleri içinde yer almalıdır. Biçimsel parametrelerin isimleri benzersiz olmalıdır.
Aşağıda, sayısal tipli (tamsayı ve reel sayılar) bir dizide en büyük değeri aramak için bir fonksiyon şablonu örneği yer almaktadır:
template<typename T>
|
Bu şablon, geçirilmiş dizideki en yüksek değeri bulan ve sonuç olarak bu değere dönüş yapan fonksiyonu tanımlar. Lütfen not edin: MQL5 içindeki ArrayMaximum() fonksiyonu, en yüksek değere değil, bu değeri bulmakta kullanılabilecek indise dönüş yapacaktır. Örnek olarak:
//--- bir dizi oluştur
|
Böylece, dizideki değeri bulmak için iki aşamalı bir yol izledik. ArrayMax() fonksiyon şablonuyla, sadece uygun tipte bir diziyi fonksiyona geçirerek, gerekli tipteki sonucu alabiliriz. Yani, son iki satırın yerine
//--- dizideki en yüksek değerin pozisyonunu bul
|
Artık, dönüş tipinin, fonksiyona geçirilen dizinin tipiyle aynı olduğu tek bir satır kullanabiliriz:
//--- en yüksek değeri bul
|
Bu durumda, ArrayMax() fonksiyonunun dönüş tipi otomatik olarak dizi tipiyle eşleşecektir.
Çeşitli veri tipleriyle genel amaçlı çalışma yöntemleri oluşturmak ve argüman tipini 'string' olarak almak için typename anahtar sözcüğünü kullanın. Veri tipini dizgi olarak döndüren özel bir fonksiyon örneğini göz önüne getirelim:
#include <Trade\Trade.mqh>
|
Fonksiyon şablonları sınıf yöntemleri için de kullanılabilirler, örneğin:
class CFile
|
Fonksiyon şablonları, export, virtual ve #import anahtar sözcükleri ile bildirilmemelidir.
Şablon fonksiyonunun aşırı yüklenmesi
Bazen şablon fonksiyonların da aşırı yüklenmesi gerekebilir. Örneğin tip dönüştürme kullanarak ikinci parametrenin değerini birinciye atayan bir şablon fonksiyonumuz olabilir. MQL5, string ve bool tipleri arasında tip dönüşümüne izin vermez.. Bunu kendimiz yapabiliriz – şimdi bir şablon fonksiyonunu aşırı yükleyelim. Örneğin:
//+------------------------------------------------------------------+
|
Kod çalıştırıldığında, sonuç olarak Assign() şablonunun int+string çifti için kullanıldığını görebiliriz, aşırı yüklenmiş versiyon ise ikinci çağrı sırasında bool+string çifti için zaten kullanmış durumda.
string Assign<int,string>(int&,string)
|
Ayrıca bakınız