Override (Ezmek)

CorsaiR

Emektar
27 Ara 2005
1,228
18
Çekirdekten
Türemiş class , ana class'dan kendisine miras kalmış davranışları değiştirebilir. Türemiş class'daki method, ana class'daki methodu ancak şu şartları sağlarsa override edebilir :

Türemiş class'ın ;

· Aynı method ismine sahip olması gerekir.
· Aynı argument listesine sahip olması gerekir.
· Ayni dönüş değerine sahip olması gerekir.

Overload'da ise; değişik fonksiyonlara sahip olan metodlara aynı ismi veriyorduk, fakat bunların argument listelerinin KESİNLİKLE farkı olmaları gerekmekteydi.

Bildiğiniz gibi erişim belirliyiciler (access specifiers) dört adetti; Bunları en fazla erişilebilirden en az erişilebilire doğru sıralarsak :

· Public
· Protedted
· Friendly
· Private

Override ile ilgili diğer basit kurallardan biride :

Ezen method'un erişim beliyicisi, ezilen method'un erişim belirliyicisinden daha fazla erişilebilir olmalı ;

Örnek :

class Ana
{
**** birMetod() {
// friendly erisim belirliyicisine sahip
}
}

class Cocuk extends Ana
{
protected **** birMetod() {
// protected , friendly ye gore daha fazla
// erisilebilir oldugundan bu dogru bir
// override ornegi olur .
}
}

Son kural ise ;
Ezen method, ezilen methodun fırlattığı hatanın aynısını fırlatmalı.

Hata (Exception ) fırlatmalar ilerleyen konularda değineceğiz .

Override ile Overload , bazı durumlarda birbirine karıştıralabilir ve bu tür hataları bulma gerçekten zor işdir.

Örnek :

// overload ve override
class Sabit
{
static final int BELLEK= 5 ;
}

class AnaX
{
public **** kelimeHecele(int Sabit) {
System.out.println("AnaX kelimeHeceleX = " + Sabit );
}
}

class CocukX extends AnaX
{
// argumentlari farkli !! Hata !!
public **** kelimeHecele(Sabit sabit_sayi ) {
System.out.println("CocukX kelime Hecele = " + sabit_sayi);
}
}

public class EzmeHatasi {

public static **** hecelet(AnaX aX){
aX.kelimeHecele(Sabit.BELLEK);
}

public static **** main (String[] args){
CocukX cX = new CocukX();
EzmeHatasi.hecelet(cX);
}
} //^

Main() methodunda CocukX tipinde bir obje oluşturuyoruz. Daha sonra bu objenin referansını AnaX tipi kabul eden hecelet() methoduna gönderiyoruz.
Daha sonra hecelet() methodunun içinde bize gelen CocukX objenin kelimeHecelet() methodunu cağırıyoruz.Fakat AnaX methodunun kelimeHecelet() methodu cağrılıyor .Burada yaptığımız olay overloading'dir. Değişken isimleri kolayca birbirine karışabilir ve override yapalım derken overload yapmış oluruz . Böyle hataları bulmak çok zor olabilir.

Eğer ana class daki bir metodun ezilmesini istemiyorsak o zaman bu methodu final metod yapmamız gerekir. Böylece compiler geç bağlama (veya dinamik bağlama) için eksta kod üretmek zorunda kalmayacaktır. Final methodlarların programımıza daha performans kattığını önceki konularda belirtmiştik belki bunun sebebi bu olabilir.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.