Giriş
Method overloading C
hariç, C++, Java, C# gibi ana dillerin hepsinde var. Kurallar birbirlerine benziyor. Aşağıda konu hakkında aldığım notlar var. Overloading desteklemeyen C gibi dillerde de printf benzeri
variadic functions ile işi çözmeye çalışmışlar.
Compile Time (Static) Polymorphism
Polymorphism iki çeşit olabilir. Dynamic ve Static. Static polymorphism derleme zamanında overload edilen metodlar ile
gerçekleştirilir.
Return Type Overloading İçin Kullanılmaz
Overloading aynı isimli metodların farklı parametreler almasıdır. Metodun döndürdüğü tip overload edilmesinde etkili
değildir.
Overloading
Overloading kullanırken dikkat edilmesi gereken kural, derleyici her zaman "most specific argument" kuralını
uygular. Bu kural Java ve C# için de geçerlidir.
Buradaki C# örneğinde null verilen parametre object yerine double [] alan metodun çağırılmasına sebep oluyor. Açıklaması ise yukarıdaki ile aynı. Hiyerarşide "most specific argument" ı bulmak için T1 yani double [] ile object arasında dönüşüm olmalı ancak object 'ten double [] 'ye dönüşüm olmamalı.
Overloading ve Kalıtım
Kalıtım ve overloading bence yanyana gelmemesi gereken iki şey. Mümkünse kullanmamak en iyisi. Kalıtan sınıfın herhangi bir metodu çağrılabilecek durumda ise, yukarıda "most specific argument" kuralı gerçersiz olabiliyor, ve ilk bulunan metod çağrılabiliyor.
Örnek:
Overloading ve Hiding Arasındaki Fark
Hiding için kalıtım gerekir.
C++
Metod parametresi değişirse alt sınıfın metodu hide edilir. Örnek'te B sınıfı A sınıfının f metodunun saklanmasına sebep olur.
A {
public:
void f(int i) {cout << i;}
};
class B: public A {
public:
void f(string s) {cout << s;}
};
void main() {
A a;
B b;
a.f(1);
b.f("zazaza");
b.f(1); //Compilation fail
}
C++'ta using ifadesi ise hide edilen metod tekrar kullanıma açılabilir. Yukarıdaki örnek'te A'nın metodunun unhide edilmesi şöyle
yapılır.
class B: public A
{
public:
using A::f;
//^^^^^^^^^
void f(string s)
{
cout << s;
}
};
C#
Eğer sadece return type değişirse bir metod diğerini saklar. C#
örneğinde hiding gösteriliyor.
public class S
{
public S()
{
}
public int myFunc(int a, int b)
{
return a + b;
}
}
public class M:S
{
public M()
{
}
public string myFunc(int a, int b)
{
return (a + b).ToString();
}
}
public class Test
{
public static void Main(string[] args)
{
M mm = new M();
mm.myFunc(1,2); // Why I am not able to access S class myFunc
}
}