23 Mayıs 2014 Cuma

Inner Class

Inner Class
Inner class veya nested class veya local class iç içe bulunan sınıfları belirtir. Hemen her nesneye dayalı programlama dilinde bu özellikle bulunur

Programlama Dillerinde Kullanımı
C++
Inner Class yazısına taşıdım.

Java
Inner Class yazısına taşıdım.

19 Mayıs 2014 Pazartesi

Overloading

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
    }
}