Bu özelliğin kullanımı şu şekildedir.
void Test(int ... v);
Bu prototip şunu söylemektedir. Bana int türünden parametre gönder sayısı önemli değil. Olay tamamen bundan ibaret şimdi birde neler yapabiliriz neler yapamayız neler yaparsak hata olur onlara bir bakalım.
Öncelikle fonksiyonumuz birden fazla parametrenin yanında değişken uzunluklu argüman alabilir. Örnek kod ile gösterirsek.
void f1(double x, int ... v); void f2(int x, int ... v); void f3(int x, double, y, int ... v);
gibi;
Fakat kurallarımızdan birincisi gördüğünüz gibi değişken uzunluklu argüman en sonda olmalı. Bilmemiz gereken bir diğer kural ise sadece bir adet değişken uzunluklu argüman bulunmalı.
void foo(double x, int ... v, boolean ... b); //Hata
Kurallarımız bu kadar bu kurallara uyduk şimdi ise overload mekanizmasını bu fonksiyonlarda nasıl kullanırız onlara bakalım.
Değişken Uzunluklu Argüman Alan Fonksiyonlarda Overloading
Overload mekanizması (bkz. ) aynı isimle farklı parametreli fonksiyonlar yazmak için işimize yarıyordu. Şimdi değişken uzunluklu argüman alan fonksiyonlarda bu olay nasıl oluyor ne gibi sorunlarla karşılaşabiliriz ona bakacağız. Overload mekanizması yine aynı mantıkla çalışmakta imzaları farklı olduğu sürece overload olmaktadır. Örnek ile gösterirsek;
void foo(int ... v); //1. Fonk void foo(boolean ... v); //2. Fonk void foo(double x, int ... v); //3. Fonk void foo(double x, int y, int ... v); //4. Fonk void foo(int x, int ... v); //5. Fonk
Gördüğünüz gibi overlaod mekanizması hepsi için geçerli fakat tabi bu fonksiyonları overload ederken dikkat etmemiz gereken noktalar var. 1. fonksiyon , 2.-3.-4. overload edilebilir bir sıkıntı çıkarmaz. Fakat 5. ile edilebilmesine rağmen eğer ki fonksiyon foo(1); gibi tek bir int değer ile çağırırsak ambiguity olur. Derleyici hangi fonksiyonu çağıracağını bilemez. Aynı nedenlerden dolayı 3. ile 4. fonksiyonları da bir arada bulundurmak aynı hatayı karşınıza getirebilir. Eğer foo(2.1, 1); ile fonksiyon çağırılırsa ambiguity olur derleyici hangisini çağıracağını bilemez ve hata oluşur.
Değişken uzunluklu argüman alan fonksiyonlar sıfır argüman "foo();" ile çalışabilir olduğunu göz önüne alarak sizde bunlara benzer hataları anlayabilirsiniz.
Yazımızın sonuna geldik başka bir yazıda görüşmek üzere umarım faydalı olmuştur.
Hiç yorum yok:
Yorum Gönder