Yazımızın içeriğini video olarak ta izleyebilirsiniz.
Inheritance Kalıtım Miras Alma Nedir?
Daha önce nesne yönelimli programlamaya giriş dersimizde aşağıda ki gibi kısa bir tanımlama yapmıştık.
” Nesnelerin ortak özelliklerini tanımlanan sınıftan almasıdır diyebiliriz. Örneğin bir okulda ilk, orta ve lise olduğunu düşünelim. Her bölüm için bir sınıf oluşturduk. Ancak bunların ortak özellikleri olan adı, soyadı gibi bilgileri oluşturduğumuz öğrenci sınıfından hepsine aktarabiliriz. Buradaki üst sınıf parent olur alt sınıf ise child. Buna parent – child ilişkisi denir. “
Şimdi bunu örneklemeye çalışalım;
Bir okul düşündük ve içerisinde ilk, orta ve lise bölümleri var. Bunlar için bir öğrenci sınıfı oluşturup ad, soyad, adres, telefon gibi bilgileri burada tutabiliriz. Ancak bunların dışında ilk, orta ve lise bölümlerinin kendine özgü özellikleri olabilir. Mesela ilk okulda seçmeli ders olmayacaktır ama lisede olacaktır. O zaman öğrenci sınıfı içerisinde seçmeli ders diye bir alan oluşturursak ilkokulda bunun karşılığı boş yani null olacaktır. Bunu istemeyiz. Yine bu örneği çoğaltırsak ortaokul öğrencilerinin kulübü olduğunu düşünelim, fakat ilk okulda ve lisede kulüp yok. Yine bu alan ilkokulda ve lisede boş kalmış yani null olmuş olur. Bu doğru bir yaklaşım olmaz.
Peki biz ilkokul, ortaokul ve lise için ayrı sınıflar oluştursak ve her birine yine adı, soyadı, adres, telefon gibi ortak özellikleri de tanımlasak, aynı zamanda ilkokula özgü olan etkinlik, ortaokul sınıfımızda kulüp, lise sınıfımızda seçmeli ders diye alanlar tanımlasak nasıl olur? Bu doğru bir yaklaşım olmaz. Her birinde adı, soyadı, adres, telefon gibi daha bir sürü ortak özellik olabilir. Belki bu elli tane belki yüz tane olacak. Bir yerde kod tekrarı varsa orada doğru yaklaşım uygulanmamıştır. İşte burada devreye inheritance yani kalıtım giriyor. Biz ortak özelliklerimizi üst sınıfımızdan miras alacağız.
Nasıl mı?
Bir parent yani üst sınıf kuracağız. Örneğimize göre adı öğrenci olacak. Yine ilkokul, ortaokul ve lise için sınıflarımız olacak. Bizim ortak özelliklerimizi öğrenci sınıfımıza yazacağız ve diğer sınıflarımıza buradan miras yolu ile aktaracağız. Şöyle bir mantık olacak. Her ilkokulda okuyan, her ortaokulda okuyan ve lisede okuyan aynı zamanda bir öğrenci ama her öğrenci ilkokul, ortaokul veya lise öğrencisi değil.
Örnekleyelim;
Aşağıda bir öğrenci sınıfı oluşturalım.
extends Anahtar Kelimesi Kullanımı
Biz oluşturacağımız ilkokul, ortaokul ve lise sınıflarını üst sınıf olan öğrenci sınıfından kalıtabilmek için extends anahtar kelimesini kullanacağız.
Oğrenci Sınıfımız;
class Ogrenci {
late String ad;
late String soyAd;
late String adres;
late int telefon;
}
Ilkokul Sınıfımız;
import 'nesne-inheritance-ogrenci.dart';
class Ilkokul extends Ogrenci {
late String etkinlik;
}
//extends anahtar kelimesi ile üst sınıf olan Ogrenci den ortak özellikleri miras aldık.
Ortaokul Sınıfımız;
import 'nesne-inheritance-ogrenci.dart';
class Ortaokul extends Ogrenci {
late String kulup;
}
//extends anahtar kelimesi ile üst sınıf olan Ogrenci den ortak özellikleri miras aldık.
Lise Sınıfımız;
import 'nesne-inheritance-ogrenci.dart';
class Lise extends Ogrenci {
late String secmeliDers;
}
//extends anahtar kelimesi ile üst sınıf olan Ogrenci den ortak özellikleri miras aldık.
Artık ana fonksiyonumuz olan main içerisinde nesne üretirsek ad, soyad, adres ve telefon bilgileri de bütün sınıflarımızda gelecektir.
Ancak dikkat ettiyseniz hiç bir sınıfımızda constructor oluşturmadık. Bu da demek oluyor ki nesnelere bilgi girerken unutulan boş değerler olabilir. Bunu istemeyiz. Ayrıca nesneyi tanımladığımız anda değerlerini girmek isteyebiliriz. O yüzden constructor oluşturmalıyız.
Öğrenci sınıfımızı birde constructor oluşturarak yazalım;
super Anahtar Kelimesi Kullanımı
class Ogrenci {
late String ad;
late String soyAd;
late String adres;
late int telefon;
Ogrenci(this.ad, this.soyAd, this.adres, this.telefon);
//constructor oluşturduk.
}
Miras aldığımız alt sınıflarda da constructor tanımlamamız gerekiyor. Hatırlarsanız daha önce nasıl this kullanıyorduk, bulunduğu sınıfı temsil ediyordu, şimdide super diyerek bir üst sınıfı temsil edicez. Ilkokul, Ortaokul ve Lise sınıflarımızı tekrar yazalım. Bu sefer constructor da ekliyoruz. Üst sınıf olan öğrenci sınıfının constructor ını super ile ekliyoruz.
import 'nesne-inheritance-ogrenci.dart';
class Ilkokul extends Ogrenci {
late String etkinlik;
Ilkokul(String ad, String soyAd, String adres, int telefon, this.etkinlik)
: super(ad, soyAd, adres, telefon);
}
import 'nesne-inheritance-ogrenci.dart';
class Ortaokul extends Ogrenci {
late String kulup;
Ortaokul(String ad, String soyAd, String adres, int telefon, this.kulup) : super(ad, soyAd, adres, telefon);
}
import 'nesne-inheritance-ogrenci.dart';
class Lise extends Ogrenci {
late String secmeliDers;
Lise(String ad, String soyAd, String adres, int telefon, this.secmeliDers) : super(ad, soyAd, adres, telefon);
}
Artık ana fonksiyonumuz olan main içerisinde Ilkokul, Ortaokul ve Lise nesneleri üretebiliriz. Constructor dan dolayı doldurulması zorunlu alanlar gelecektir. Bu yüzden null olması gibi bir durum da söz konusu olamaz.
import 'nesne-inheritance-ilkokul.dart';
import 'nesne-inheritance-lise.dart';
import 'nesne-inheritance-ortaokul.dart';
void main(List<String> args) {
Ilkokul ogrIlk1 =
Ilkokul("mehmet", "eser", "ertuğrul gazi", 4444, "boyama etkinliği");
Ortaokul ortaokul1 =
Ortaokul("ayşe", "ak", "istanbul", 5555555, "yazılım kulübü");
Lise lise1 =
Lise("zeynep", "yıldız", "edirne", 6666666, "seçmeli ders matematik");
}
neden uzatıyon anlayacağımız şekilde yaz
Elimden geldiği kadar sade tutmaya çalıştım, Ancak konuları sırası ile takip etmek gerekiyor