Merhabalar.

Bir önceki dersimizde öğrendiklerimizi bu dersimizde örnekleriyle hayata geçireceğiz.

Örneğin Hayvanlarla ilgili bir proje yapıyor olalım.

Kedi ve Köpekler odaklandığımız iki sınıf olsun.

Kedi ve köpekler için ayrı ayrı sınıflar yazıp ilgili işlemleri buradan yönetmek OOP yapısına en uygun hareket olacaktır.

Kedi sınıfının Propertyleri isim, renk, cins ve yaş olsun.

Kedi sınıfının Metodları ise Miyavla, Yemekye, ve Koş olsun.

Köpek sınıfının Propertyleri isim, cins, doğumtarihi olsun.

Köpek sınıfının Metodları ise Havla, yemekye, ve Koş olsun.

Şimdi öncelikler bu sınıfları bu şekilde daha önceden öğrendiklerimize göre oluşturmaya çalışalım.

Bu sınıfları aynı dosya içinde yaratabiliriz. İşimizi şu anda kolaylaştırmak için farklı dosyalarda yazmayacağım.

void main() {}

class Cat {
  String name;
  String type;
  String color;
  int age;

  void miyav() {
    print("Kedi Miyavladı");
  }

  void eat() {
    print("Kedi Yemek Yiyor");
  }

  void run() {
    print("Kedi Koşuyor");
  }
}

class Dog {
  String name;
  String type;
  String birthDay;

  void havla() {
    print("Köpel Havladı");
  }

  void eat() {
    print("Köpek Yemek Yiyor");
  }

  void run() {
    print("Köpek Koşuyor");
  }
}

Şimdi gördüğünüz üzere iki sınıfa ait ortak özellikler ve ortak metodlar var.

Bu bize şunu anımsatacak acaba bu iki sınıf için bir üst sınıf yazabilir miyim sorusunu.

Bu soruyu sorduğumda diyebiliyorum ki kedi bir hayvan mı evet, köpek bir hayvan mı evet. O zaman iki sınıfın hayvan sınıfından türediği bir yapı oluşturabilirim.

O zaman yapmamız gereken ilk işlem iki sınıfta ortak olan özellikleri hayvan sınıfını oluşturup oraya taşımak.

Orada bu işlemi yaptıktan sonra alt sınıflarda bu özelliklerin bulunmasına gerek yok. Burada sadece alt sınıfların üst sınıftan türedini belirtmemiz yeterli olacak. Bunun için extends tanımlama ismini kullanacağız.

Hadi hayvan sınıfını yaratalım ilk olarak.

void main() {
  
}

class Animals{
  
  String name;
  String type;

  void eat() {
    print("Hayvan Yemek Yiyor");
  }

  void run() {
    print("Hayvan Koşuyor");
  }
}

class Cat {
  String name;
  String type;
  String color;
  int age;

  void miyav() {
    print("Kedi Miyavladı");
  }

  void eat() {
    print("Kedi Yemek Yiyor");
  }

  void run() {
    print("Kedi Koşuyor");
  }
}

class Dog {
  String name;
  String type;
  String birthDay;

  void havla() {
    print("Köpel Havladı");
  }

  void eat() {
    print("Köpek Yemek Yiyor");
  }

  void run() {
    print("Köpek Koşuyor");
  }
}
class Animals{
  
  String name;
  String type;

  void eat() {
    print("Hayvan Yemek Yiyor");
  }

  void run() {
    print("Hayvan Koşuyor");
  }
}

Hayvan sınıfımızı yazdık.

Şimdi Cat ve Dog sınıflarını animals sınıfından türettiğimizi kalıtım aldığımız gösterelim.

Bunun için şunu yapacağız.

Class Cat extends Animals{

}

Bu şekilde yapılır.

Bunu yapıp ortak alanları alt sınıflardan silelim.

void main() {

}

class Animals{

  String name;
  String type;

  void eat() {
    print("Hayvan Yemek Yiyor");
  }

  void run() {
    print("Hayvan Koşuyor");
  }
}

class Cat extends Animals{
  
  String color;
  int age;

  void miyav() {
    print("Kedi Miyavladı");
  }
}

class Dog extends Animals{
  
  String birthDay;

  void havla() {
    print("Köpel Havladı");
  }
}

Şimdi kalıtımın nasıl gerçekleştiğini anlayalım.

Main metodu içinde Cat sınıfından bir instance üretelim.

Gördüğünüz gibi Cat sınıfı içinde bazı özellikler ve metodlar olmamasına rağmen kalıtım sayesinde o özellikler artık Cat sınıfına da aitmiş gibi görünüyor.

Şimdi değerler atayalım. Ekran çıktılarını görelim.

void main() {

  Cat cat1 = Cat();
  cat1.name = "Zeytin";
  cat1.age = 3;
  cat1.color = "Beyaz";
  cat1.type = "Van Kedisi";

  cat1.miyav();
  cat1.eat();
  cat1.run();

  Dog dog1 = Dog();

  dog1.name = "Karabaş";
  dog1.birthDay = "21.02.2019";
  dog1.type = "Kangal";

  dog1.havla();
  dog1.run();
  dog1.eat();

}

class Animals{

  String name;
  String type;

  void eat() {
    print("Hayvan Yemek Yiyor");
  }

  void run() {
    print("Hayvan Koşuyor");
  }
}

class Cat extends Animals{

  String color;
  int age;

  void miyav() {
    print("Kedi Miyavladı");
  }
}

class Dog extends Animals{

  String birthDay;

  void havla() {
    print("Köpel Havladı");
  }
}
H:\Dart_Tutorial\hello_dart\bin>dart 28_inheritence_overriding.dart
Kedi Miyavladı
Hayvan Yemek Yiyor
Hayvan Koşuyor
Köpel Havladı
Hayvan Koşuyor
Hayvan Yemek Yiyor

Overriding Kavramı

Şimdi burada dikkatimizi bir konu çekiyor. Ben kediden de çağırsam, köpekten de çağırsam metodu bana hayvan yemek yiyor ya da hayvan koşuyor ifadesini görüyorum.

Ben ise şunu yapmak istiyorum. Kediden çağırdığımızda kedi yemek yiyor, köpekten çağırdığımızda köpek yemek yiyor yazsın istiyorum.

İşte burada devreye metodları yeniden yazabilmemizi sağlayan override kavramı çıkıyor.

Şimdi Cat sınıfı içine gidelim ve eat yazalım.

Tıkladığımızda yapıyı bizim için oluşturur. Eğer parametreleri varsa üst sınıftaki haliyle burada oluşturulur.

@override
  void eat() {
    // TODO: implement eat
    super.eat();
  }

Gövdedeki kodları değiştirip özelleştireceğiz.

super Kavramı

super diye gördüğümüz kavram bir üst sınıfı işaret eder.

super.eat(); yazan kodun anlamı bizim işlemlerimizden sonra üst sınıftaki eat metodunun içindeki kodlarında çalıştırılacağı anlamına gelir.

Eğer oradaki hiçbir kod çalışsın istemiyorsanız bu kodu silebilirsiniz.

Kodu şöyle güncelleyelim.

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

Bu işlemin aynısını diğer metodlar içinde yapalım.

void main() {

  Cat cat1 = Cat();
  cat1.name = "Zeytin";
  cat1.age = 3;
  cat1.color = "Beyaz";
  cat1.type = "Van Kedisi";

  cat1.miyav();
  cat1.eat();
  cat1.run();

  Dog dog1 = Dog();

  dog1.name = "Karabaş";
  dog1.birthDay = "21.02.2019";
  dog1.type = "Kangal";

  dog1.havla();
  dog1.run();
  dog1.eat();

}

class Animals{

  String name;
  String type;

  void eat() {
    print("Hayvan Yemek Yiyor");
  }

  void run() {
    print("Hayvan Koşuyor");
  }
}

class Cat extends Animals{

  String color;
  int age;

  void miyav() {
    print("Kedi Miyavladı");
  }

  @override
  void eat() {
    print("Kedi Yemek Yiyor");
  }
  @override
  void run() {
    print("Kedi Koşuyor");
  }
}

class Dog extends Animals{

  String birthDay;

  void havla() {
    print("Köpel Havladı");
  }
  
  @override
  void eat() {
    print("Köpek Yemek Yiyor");
  }
  
  @override
  void run() {
    print("Köpek Koşuyor");
  }
}

Burada işleyiş şu şekildedir. Biz üst sınıfa ait bir fonksiyonu çağırdığımızda ilk olarak o fonksiyonun alt sınıfta override edilip edilmediğine bakılır. Eğer edilmişse o kodlar işletilir. Üst sınıftaki kodlar çalıştırılmaz.

Eğer override işlemi yoksa üst sınıftaki kodlar çalışır.

H:\Dart_Tutorial\hello_dart\bin>dart 28_inheritence_overriding.dart
Kedi Miyavladı
Kedi Yemek Yiyor
Kedi Koşuyor
Köpel Havladı
Köpek Koşuyor
Köpek Yemek Yiyor

Sonuçlar istediğimiz gibi geldi.

Böylelikle kalıtım konusunda bir adım daha ilerlemiş olduk.

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.