OOP kullanım özelliklerine baktığımız zaman bir nesnesnin diğer nesneden kalıtlanabileceği biliyoruz. Hepimizin kullandığı bilgisayar bileşenlerinden örnek verelim. Mesla bilgisayar kullanmı için bir fareye ihtiyacımız var ve bu fare strandard iki tuşlu fare olsun. Daha sonradan yetmeyerek daha işlevsel bir fare kullanmaya başlıyorsunuz. İkisi de temel özellikler olarak birbiri yerine kullanılabilir. Tabi sonradan eklenen görece daha özel olan özellikleri saymıyorum. Şimdi kod örneklemesiyle bakalım
class Fare {
public void tikla() {}
}
class OyunFaresi extends Fare {
public void scrollKullan() {}
}
Fare kullanilan = new Fare();
Şimdi genel amaçlı fareyi kullanmak için bir değişkene atadık. İşlemlerimizi bu sınıf üzerinden yapabiliriz. Şimdi yeni bir fare kullanmamız gerekse(oyunfaresi) bunu Fare türünden bir değişkene atayabilir miyiz?
Fare kullanılan = new OyunFaresi(); // otomatik upcasting
Cevabımız, evet atayabiliriz. Çünkü OyunFaresi normal fare üzerinden türeyen bir sınıf. Bu da demek oluyor ki OyunFaresi doğal olarak bir fare.
Burda bir sınırlama karşımıza çıkıyor. OyunFaresi'ni normal bir fare olarak değişkene atadığımız için bu nesne bize sadece normal farenin yapabildiği işlemleri yapacak. Yani sadece tikla() komutunu yerine getirecek. Şayet bu nesneyi bir OyunFaresi olarak kullanmak istiyorsak bunu aynı türden bir değişkene atamamız gerekirdi.
OyunFaresi kullanilacak = kullanilan; // burada compile-time-error (derleme zamanı hatası alırız)
Peki hatayı neden alırız çünkü programlama dili fare tipindeki değişkeni kendisini türeten bir nesneye nasıl atanır bilemeyecek. Bizim bu farenin hangi tarz bir fare olduğunu belirtmemiz gerekiyor.
OyunFaresi kullanılacak = (OyunFaresi)kullanilan; //downcasting
Kısaca özetlemek gerekirse. Genelden özele doğru gidilen sınıf yapısında genel olan sınıflar özel olanların ne iş yaptığını bilemez. Genel sınıfları özel tarzda bir değişkene atadığımız zaman belirmeliyiz. Buna downcasting denir. Tersi duruma, yani özelden genele doğru çıkılan durumlarda ise upcasting denir.
İyi çalışmalar.