Gizli bir isme erişmek için base kullanımı [7]

base'in biraz this gibi davranan ikinci bir şekli de vardır. Bunun this'ten tek farkı, bunun her zaman kendisinin kullanılmakta olduğu türerilmiş sınıfın türediği temel sınıfına referansta bulunmasıdır. Bu kullanımının genel yapısı şu şekildedir:

base.üye

Burada üye, bir metot yada bir örnek değişken olabilir. base'in bu tür kullanımı bir türetilmiş sınıf içindeki aynı isimli üyeyi gizlediği durumlar için çok uygundur. Bir önceki başlıktaki örnekteki sınıf hiyerarşisinin şu versiyonunu ele alalım.

// Isim gizliliginin ustesinden gelmek icin base kullanmak.
using System;
class A {
public int i=0;
}

// Turetilmis sinif olustur.
class B : A {
new int i; // bu i, A'nin icindeki i'yi gizliyor.
public B(int a, int b) {
base.i=a; // bu, A'nin icindeki i'yi ortaya cikariyor.
i=b; // B'nin icindeki i
}
public void show() {
// bu, A'nin icindeki i'yi gosterir.
Console.WriteLine("i in base class: " + base.i);
// bu, B'nin icindeki i'yi gosterir.
Console.WriteLine("i in derived class: " + i);
}
}

class UncoverName {
public static void Main() {
B ob=new B(1, 2);
ob.show();
}
}

Verdiği çıktı:

i in base class: 1
i in derived class: 2

B'nin içindeki i örnek değişkenini A'nın içindeki i'yi gizliyor olsa da base, temel sınıf içinde tanımlanmış i'yi erişim imkanı verir.
Gizlenmiş metotlar da base kullanılarak çağrılabilir. Şu örneği inceleyin.

// Gizlenmis bir metot cagir.
using System;
class A {
public int i=0;
// A'nin icindeki show()
public void show() {
Console.WriteLine("i in base class: " + i);
}
}

// Turetilmis bir sinif olustur.
class B : A {
new int i; // bu i, A'nin icindeki i'yi gizler.
public B(int a, int b) {
base.i=a; // bu i, A'nin icindeki i'yi ortaya cikarir.
i=b; // B'nin icindeki i
}

// Bu, A'nin icindeki show()'u gizler. new kullanımına dikkat edin.
new public void show() {
base.show(); // bu, A'nin icindeki show()'u cagirir.
// bu, B'nin icindekii'yi gosterir.
Console.WriteLine("i in derived class: " + i);
}
}

class UncoverName {
public static void Main() {
B ob=new B(1,2);
ob.show();
}
}

Programin çıktısı aşağıdaki gibidir.

i in base class: 1
i in derived class: 2

Gördüğünüz gibi base.show(), show()'un temel sınıf içinde yer alan versiyonunu çağırmaktadır. Bir diğer husus: Bu programda, A'nın içindeki show()'u gizleyen show() adında yeni bir metot oluşturulmakta olduğunu bildiğinizi derleyiciye anlatmak için new kullanıldığına dikkat edin.

Kaynak: Herbert Schildt
Herkes için C#

Hiç yorum yok:

Yorum Gönder