Abstract ın türkce karşılığı “soyut” demektir , pekii neden soyut class lara ihtiyaç duyarız ? Abstract ın türkce karşılığı “soyut” demektir , pekii neden soyut class lara ihtiyaç duyarız ? DenemeSurusu3.java örneğini incelersek ; ana class olan Araba.class ının bir birleştirici rol oynadığı görülür . Yani kendinden türeyen tipler için bir ortak arayüzler(methodlar) sağlar . Olaylara bu açıdan bakarsak ana class lara “kukla “ diyebiliriz ve bu ana class ın methodlarının çağrılması bazı durumlarda hata bile oluşturabilir. İstenilen aslında şudur , ana class oluşturmak ve sonra bu ana class dan türemiş class lar türetmek ve türemiş class lara kendilerine has davranışları oluşturmak , override ile .
“Kukla“ class diye tabir edebileceğimiz class ları java da Abstract class olarak tanımlarız . Bir class ın Abstract olabilmesi için metodlarından en az birinin abstract method olması gerekir.
abstract **** sur();
Abstract methodlar kesinlikle türeyen class larda override edilmek zorundadır.
Eğer override edilmez ise compile-time da hata yerseniz .
Yukarıdaki şemayı koda dökelim :
// abstract class ve methodlar
abstract class Araba
{
public abstract **** sur() ;
public **** dur() {
System.out.println("Araba dur");
}
}
class YarisArabasi extends Araba
{
public **** sur() {
System.out.println("YarisArabasi sur");
}
public **** dur() {
System.out.println("YarisArabasi dur");
}
public **** hizYap() {
System.out.println("Hizzzz Yapp");
}
}
class AileArabasi extends Araba {
public **** sur() {
System.out.println("AileArabasi sur");
}
public **** dur() {
System.out.println("AileArabasi dur");
}
public **** konforOlustur() {
System.out.println(" AileArabasi KonforOlustur( )");
}
}
class YukArabasi extends Araba {
public **** sur() {
System.out.println("YukArabasi sur");
}
public **** dur() {
System.out.println("YukArabasi dur");
}
public **** frenABS() {
System.out.println(" YukArabasi frenABS() ");
}
}
class GencArabasi extends AileArabasi
{
public **** sur() {
System.out.println("GencArabasi sur ");
}
public **** kontrolSistemi() {
System.out.println(" GencArabasi kontrolSistemi() ");
}
}
public class DenemeSurusu4 {
public **** hepsiniSur(Araba[] ar) {
for (int i = 0 ; i < ar.length ; i ++ )
{
ar[ i ].sur();
}
}
public static **** main(String args[]) {
DenemeSurusu3 ds3 = new DenemeSurusu3();
Araba[] ara_ar = new Araba[4] ;
int sayac = 0 ;
// Array e eklerken upcasting oluyor
ara_ar[sayac++] = new AileArabasi();
ara_ar[sayac++] = new YarisArabasi();
ara_ar[sayac++] = new YukArabasi();
ara_ar[sayac++] = new GencArabasi();
// ara_ar[sayac++] = new Araba(); !! hata !!
// abstract class lar yaratilamazlar .
ds3.hepsiniSur( ara_ar );
}
}//^
DenemeSurusu3.java ile bu örnek arasındaki tek fark Araba.class ının abstract hale getirilmesi . sur() metodu artik abstract bir method ve Araba tipinden türeyen her yeni tip sur() metodunu override (ezmek) zorundadır.
Araba.class ındaki dur() methodu eski haline korumaktadır ve Araba tipinden dan türeyen diğer tiplerler bu methodu KESİNLİKLE ezmek zorunda değiller ama isterlerse ezebilirler.Buradan şu sonucu çıkarabiliriz ; Abstract class ların içinde en az bir tane abstract method bulunmak zorundadır ve bir class ın abstact olması bu class içersine fonksiyonel method bulunmayacağı anlamına gelmez .
Son olarak da dikkat çekmek istediğim konu , abstract class ların new anahtar kelimesi ile yaratılamamaları.Abstract class lar kesinlikle en az bir tane abstract method (fonkisiyonelitesiz method ) içerdiklerinden dolayı mantıklı bir engelleme .
“Kukla“ class diye tabir edebileceğimiz class ları java da Abstract class olarak tanımlarız . Bir class ın Abstract olabilmesi için metodlarından en az birinin abstract method olması gerekir.
abstract **** sur();
Abstract methodlar kesinlikle türeyen class larda override edilmek zorundadır.
Eğer override edilmez ise compile-time da hata yerseniz .
Yukarıdaki şemayı koda dökelim :
// abstract class ve methodlar
abstract class Araba
{
public abstract **** sur() ;
public **** dur() {
System.out.println("Araba dur");
}
}
class YarisArabasi extends Araba
{
public **** sur() {
System.out.println("YarisArabasi sur");
}
public **** dur() {
System.out.println("YarisArabasi dur");
}
public **** hizYap() {
System.out.println("Hizzzz Yapp");
}
}
class AileArabasi extends Araba {
public **** sur() {
System.out.println("AileArabasi sur");
}
public **** dur() {
System.out.println("AileArabasi dur");
}
public **** konforOlustur() {
System.out.println(" AileArabasi KonforOlustur( )");
}
}
class YukArabasi extends Araba {
public **** sur() {
System.out.println("YukArabasi sur");
}
public **** dur() {
System.out.println("YukArabasi dur");
}
public **** frenABS() {
System.out.println(" YukArabasi frenABS() ");
}
}
class GencArabasi extends AileArabasi
{
public **** sur() {
System.out.println("GencArabasi sur ");
}
public **** kontrolSistemi() {
System.out.println(" GencArabasi kontrolSistemi() ");
}
}
public class DenemeSurusu4 {
public **** hepsiniSur(Araba[] ar) {
for (int i = 0 ; i < ar.length ; i ++ )
{
ar[ i ].sur();
}
}
public static **** main(String args[]) {
DenemeSurusu3 ds3 = new DenemeSurusu3();
Araba[] ara_ar = new Araba[4] ;
int sayac = 0 ;
// Array e eklerken upcasting oluyor
ara_ar[sayac++] = new AileArabasi();
ara_ar[sayac++] = new YarisArabasi();
ara_ar[sayac++] = new YukArabasi();
ara_ar[sayac++] = new GencArabasi();
// ara_ar[sayac++] = new Araba(); !! hata !!
// abstract class lar yaratilamazlar .
ds3.hepsiniSur( ara_ar );
}
}//^
DenemeSurusu3.java ile bu örnek arasındaki tek fark Araba.class ının abstract hale getirilmesi . sur() metodu artik abstract bir method ve Araba tipinden türeyen her yeni tip sur() metodunu override (ezmek) zorundadır.
Araba.class ındaki dur() methodu eski haline korumaktadır ve Araba tipinden dan türeyen diğer tiplerler bu methodu KESİNLİKLE ezmek zorunda değiller ama isterlerse ezebilirler.Buradan şu sonucu çıkarabiliriz ; Abstract class ların içinde en az bir tane abstract method bulunmak zorundadır ve bir class ın abstact olması bu class içersine fonksiyonel method bulunmayacağı anlamına gelmez .
Son olarak da dikkat çekmek istediğim konu , abstract class ların new anahtar kelimesi ile yaratılamamaları.Abstract class lar kesinlikle en az bir tane abstract method (fonkisiyonelitesiz method ) içerdiklerinden dolayı mantıklı bir engelleme .