Merhabalar.

Kalıtım konumuza abstract sınıflarla devam ediyoruz.

Abstract(Soyut) sınıfların kendine has özellikleri vardır.

Neden kullandığımızı anlamaya çalışalım.

Şimdi şöyle bir senaryo hayal edelim. Bir takım halinde proje geliştiriyorsunuz. Ekibinize sonradan bir kişi daha katıldı.

Projemizde aynı işleri yapan yüzlerce sınıf var. Arkadaşımıza aynı işleri yapan bu yüzlere sınıfı ve işlerini anlatmak yerine. Şöyle bir şey yapabilir miyiz diye bir soru akla geliyor. Bir sınıf olsun bu sadece yapılacak olan işleri belirtsin.

Biz yeni gelen arkadaşımıza sadece oluşturduğumuz bu görev sınıfını anlatsak ve şöyle desek şu 100 sınıf bu sınıftan kalıtılacak desek. İşimizi o kadar kolaylaştıracaktır ki.

Yazılımcı arkadaşımız oluştacağı sınıfı ilgili sınıftan extends ettiğinde onu yapılacak işlerin o class’ın içinde tanımlanması için zorlayacaktır. Böylelikle hiçbir metod atlanmamış olacaktır.

Tabii ki sadece bir ekip arkadaşına kolayca işleri aktarmak için kullanmıyoruz. Abstract sınıflar kendi başımıza kod yazsakta kullandığımızda işlerimizi kolaylaştıran yapılardır.

İşte yarattığımız bu tür soyut sınıflara abstract sınıflar diyoruz.

Abstract sınıflardan nesne türetilemez. Sadece extends edilebilirler.

Tanımlama

abstract class ClassName{

Olaylar.

}

Şimdi canlı bir örnek yapınca daha iyi anlayacağız.

Örneğin Kedi ve köpek diye iki tane sınıfımz olsun. Ve bu iki sınıfın ortak özellikleri olsun.

Propertyleri > isim, tür, yas;

Metodları > Ye, koş, uyu olsun.

Şimdi ilk işimiz bir üst abstract sınıfı oluşturup bu özellikleri belirteceğiz.

void main(){
  
}

abstract class Animal{
  
  String name;
  String type;
  int age;
  
  void Eat();
  void Run();
  void Sleep();
  
}

Gördüğümüz gibi özellik ve metodlarımızı sadece bildirdik. Gövdelerinde herhangi bir şey yapmadık.

Abstract sınıflarda bu arada metodların gövdeleri yazılıp işlem yapılabilir.

Bir metod da öyle yapalım.

void main(){

}

abstract class Animal{

  String name;
  String type;
  int age;

  void Eat();
  void Run();
  void Sleep();
  
  int DrinkWater(int a){
    int b = a ~/ 2;
    return b;
  }

}
int DrinkWater(int a){
    int b = a ~/ 2;
    return b;
  }

Burada son yazdığımız metod int tipinde geri dönüş tipine sahip ve int bir parametre alıp. Gönderilen değeri 2 ye bölüp geri döndürüyor.

Şimdi kedi ve köpek sınıflarımızı yaratalım. Animal sınıfından extends edelim.

class Cat extends Animal{

}

Bu sınıfı bu şekilde yazdığımızda Cat isminin altının kırmızı ile çizili olduğunu görürsünüz. Üzerine gidip Alt + Enter’a basarsanız size sorunla alakalı bilgi verecektir.

Bize diyor ki override edilmesi gereken 3 tane metod var bunları yaratın diyor. Bu seçeneğe tıkladığımızda bizim için ilgili tüm metodları ve yapıyı oluşturacaktır.

class Cat extends Animal{
  
  @override
  void Eat() {
    // TODO: implement Eat
  }

  @override
  void Run() {
    // TODO: implement Run
  }

  @override
  void Sleep() {
    // TODO: implement Sleep
  }

}

Artık metodların yapacakları işlemleri sınıfın içinde yazabiliriz.

Ancak dikkatimizi çeken bir konu var. 4. metodumuz DrinkWater metodu burada yaratılmadı. Sebebi şu arkadaşlar zaten sınıfın içinde gövdesi yazılmıştı.

Siz eğer bunu yine de ezmek isterseniz sınıfın içinde tekrardan kendiniz override edebilirsiniz. Gövdesine istediğiniz kodları yazabilirsiniz.

Eğer bu sınıfa ait 100 tane metod olsaydı. Yapmamız gereken şey bir abstract sınıfta bu 100 metodu tanımlamak ve ilgili sınıfa extends edip gösterdiğim uyarı kısmında tek tuşla 100 metoduda sizin için sınıf içinde yazmaya hazır oluşturulmasını sağlayabilirdiniz.

Şimdi köpek sınıfına aynısını yapalım.

class Dog extends Animal{
  @override
  void Eat() {
    print("Köpek Yemek Yiyor");
  }

  @override
  void Run() {
    print("Köpek Yemek Yiyor");
  }

  @override
  void Sleep() {
    print("Köpek Yemek Yiyor");
  }
}

Metodların içini doldurduk. Override ettikten sonra metodların için boş da bırakabilirsiniz. Ancak abstract içinde gövdesi yazılmamış bütün metodları override ederek alt sınıfın içinde bildirmek zorundasınız bunu unutmayınız.

Şimdi bunları main içinde kullanalım.

Not: Abstract sınıflardan nesne türetemezsiniz.

Animal animal1 = Animal();

bu şekilde bir tanımlama yapamazsınız hata alırsınız. Abstract sınıfların tek bir amacı vardır alt sınıfa hangi işleri yapması gerektiğini bildirmek.

void main(){

  Dog dog1 = Dog();
  Cat cat1 = Cat();

  dog1.name = "a";
  dog1.type = "b";
  dog1.age = 20;

  dog1.Eat();
  dog1.Run();
  dog1.Sleep();
  print(dog1.DrinkWater(47));

  cat1.name = "b";
  cat1.type = "c";
  cat1.age = 10;

  cat1.Eat();
  cat1.Run();
  cat1.Sleep();
  print(cat1.DrinkWater(47));


}

abstract class Animal{

  String name;
  String type;
  int age;

  void Eat();
  void Run();
  void Sleep();

  int DrinkWater(int a){
    int b = a ~/ 2;
    return b;
  }

}

class Cat extends Animal{

  @override
  void Eat() {
    print("Kedi Yemek Yiyor");
  }

  @override
  void Run() {
    print("Kedi Koşuyor");
  }

  @override
  void Sleep() {
    print("Kedi Uyuyor");
  }

}

class Dog extends Animal{
  @override
  void Eat() {
    print("Köpek Yemek Yiyor");
  }

  @override
  void Run() {
    print("Köpek Yemek Yiyor");
  }

  @override
  void Sleep() {
    print("Köpek Yemek Yiyor");
  }
}
Dog dog1 = Dog();
  Cat cat1 = Cat();

  dog1.name = "a";
  dog1.type = "b";
  dog1.age = 20;

  dog1.Eat();
  dog1.Run();
  dog1.Sleep();
  print(dog1.DrinkWater(47));

  cat1.name = "b";
  cat1.type = "c";
  cat1.age = 10;

  cat1.Eat();
  cat1.Run();
  cat1.Sleep();
  print(cat1.DrinkWater(47));

Sonuca bakalım.

H:\Dart_Tutorial\hello_dart\bin>dart 30_abstract.dart
Köpek Yemek Yiyor
Köpek Yemek Yiyor
Köpek Yemek Yiyor
23
Kedi Yemek Yiyor
Kedi Koşuyor
Kedi Uyuyor
23

İsterseniz gelin köpek sınıfı içinde drinkawater metodunu tekrardan override edelim ve kendi kodlarımızı yazalım. Sonuca bir de öyle bakalım.

void main(){

  Dog dog1 = Dog();
  Cat cat1 = Cat();

  dog1.name = "a";
  dog1.type = "b";
  dog1.age = 20;

  dog1.Eat();
  dog1.Run();
  dog1.Sleep();
  print(dog1.DrinkWater(47));

  cat1.name = "b";
  cat1.type = "c";
  cat1.age = 10;

  cat1.Eat();
  cat1.Run();
  cat1.Sleep();
  print(cat1.DrinkWater(47));


}

abstract class Animal{

  String name;
  String type;
  int age;

  void Eat();
  void Run();
  void Sleep();

  int DrinkWater(int a){
    int b = a ~/ 2;
    return b;
  }

}

class Cat extends Animal{

  @override
  void Eat() {
    print("Kedi Yemek Yiyor");
  }

  @override
  void Run() {
    print("Kedi Koşuyor");
  }

  @override
  void Sleep() {
    print("Kedi Uyuyor");
  }

}

class Dog extends Animal{
  @override
  void Eat() {
    print("Köpek Yemek Yiyor");
  }

  @override
  void Run() {
    print("Köpek Yemek Yiyor");
  }

  @override
  void Sleep() {
    print("Köpek Yemek Yiyor");
  }

  @override
  int DrinkWater(int a) {
    return a ~/3;
  }
}
@override
  int DrinkWater(int a) {
    return a ~/3;
  }
H:\Dart_Tutorial\hello_dart\bin>dart 30_abstract.dart
Köpek Yemek Yiyor
Köpek Yemek Yiyor
Köpek Yemek Yiyor
15
 // Buraya dikkat ediniz.
Kedi Yemek Yiyor
Kedi Koşuyor
Kedi Uyuyor
23

Bir sınıf sadece tek bir sınıftan extends edilebilir. Bu extends edilen sınıf abstract da olsa fark etmez.

Bu konumuzda bu kadardı.

Bir sonraki yazımda görüşmek üzere.


What's Your Reaction?

hate hate
0
hate
fail fail
0
fail
fun fun
0
fun
geeky geeky
0
geeky
love love
0
love
lol lol
0
lol
omg omg
0
omg
win win
0
win
Murat Bilginer
21 Şubat 1992 Doğumlu. Endüstri Mühendisi olarak Lisansını 2016 yılında tamamlamıştır. Industryolog Akademi - NGenius oluşumlarının kurucusudur. Şu anda kendi şirketi Brainy Tech ile hem Yazılım Hizmetleri Sunmakta Hem de Online Eğitimler Vermektedir.