Merhabalar kalıtıma devam ediyoruz.
Dart dilinde diğer dillerde olduğu gibi interface(arayüz) sınıflar diye bir kavram yok. Ancak biz yazdığımız sınıfları implement işlemi ile birer interface sınıfa dönüştürebiliyoruz.
Bir sınıf birden fazla sınıfdan implemente edilebilir. Ancak sadece tek bir sınıftan extends edilebilir.
Implemet etme işleminin amacı nedir?
Bir önceki konumuzda abstract sınıfları anlatmıştık. Görevi aslında aynıdır. Sadece yapılacak işlemleri anlattığımız sınıflar yaratmak ve bunları ilgili sınıflara implement etmek.
Abstract sınıflardan farkı şudur.
Bir abstract içinde yazdığımız metodlar gövdesiz ve gövdeli olarak iki şekilde yazılabiliyordu. Implemet edeceğimiz interface sınıflarda ise gövdesiz metod yazamıyoruz. Burada amacımız aslında yapılacak işlemleri de üst sınıftan almak oluyor. Üst sınıf içindeki işlem kodları alt sınıfa gelmiyor. Sadece metod ve özellik isimleri geliyor. Override ederek sınıfa özel yeniden kodlayabiliyoruz.
İmplement edilen sınıf içinde tüm özellikler override edilmesi gerekir.
Canlı bir örnekle daha iyi anlaşılacaktır.
Tanımlama
class ClassName implements ClassName2{
Olaylar
}
Şimdi öncelikle üst sınıf olan Animal sınıfını yaratıyorum.
void main(){
}
class Animal{
String name;
int age;
void Eat(){
print("Hayvan Yemek Yiyor");
}
void Run(){
print("Hayvan Koşuyor");
}
void Sleep(){
print("Hayvan Uyuyor");
}
}
Köpek ve Kedi sınıflarını yaratıp bu sınıfı implemet edeceğim.
class Cat implements Animal{
}
Bunu bu şekilde yazdığınızda Cat’in altı çizili olacaktır. Yani bir hata veriyor. Üzerine gidelim Alt + Enter’a basalım.
Gördüğünüz üzere 5 tane override edilmesi gereken özelliğin olduğunu söylüyor. Tıklayarak yaratalım.
Burada dikkatimizi bir şey çekmiş olmalı. Abstract sınıf içinde yazdığımız propertylerin override edilmesi gerekmiyordu ama sınıftan implement ettiğimizde propertylerinde override edilmesi gerektiğini görüyoruz.
void main(){
}
class Animal{
String name;
int age;
void Eat(){
print("Hayvan Yemek Yiyor");
}
void Run(){
print("Hayvan Koşuyor");
}
void Sleep(){
print("Hayvan Uyuyor");
}
}
class Cat implements Animal{
@override
int age;
@override
String name;
@override
void Eat() {
// TODO: implement Eat
}
@override
void Run() {
// TODO: implement Run
}
@override
void Sleep() {
// TODO: implement Sleep
}
}
Aynı işlemi Dog sınıfı için yapalım.
void main(){
}
class Animal{
String name;
int age;
void Eat(){
print("Hayvan Yemek Yiyor");
}
void Run(){
print("Hayvan Koşuyor");
}
void Sleep(){
print("Hayvan Uyuyor");
}
}
class Cat implements Animal{
@override
int age;
@override
String name;
@override
void Eat() {
// TODO: implement Eat
}
@override
void Run() {
// TODO: implement Run
}
@override
void Sleep() {
// TODO: implement Sleep
}
}
class Dog implements Animal{
@override
int age;
@override
String name;
@override
void Eat() {
// TODO: implement Eat
}
@override
void Run() {
// TODO: implement Run
}
@override
void Sleep() {
// TODO: implement Sleep
}
}
Bu metodların içlerini tek tek kendimiz dolduracağız.
Implemet ettiğimiz sınıfın yazmış olduğu kodlara super ile erişim sağlayamayayız. Burada amacımız üst sınıfı tamamen bir interface gibi kullanıp özellik ve metodların yazıma hazır şekilde bize sunulmasını sağlamak oldu.
Bir sınıf birden fazla sınıftan implement edilebilir.
İmplement edilen her sınıfın tüm özellik ve metodlarının override edilmesi gerekir.
Çoklu implement işlemi şöyle yapılır.
Örneğin Animal2 diye bir sınıf yaratalım.
class Animal2 {
String extras;
void ExtrasRun() {
print("Hayvan Çok Hızlı Koşuyor.");
}
}
Şimdi cat ve dog sınıflarımızı bir de Animal2 den implemet edelim.
void main() {}
class Animal {
String name;
int age;
void Eat() {
print("Hayvan Yemek Yiyor");
}
void Run() {
print("Hayvan Koşuyor");
}
void Sleep() {
print("Hayvan Uyuyor");
}
}
class Animal2 {
String extras;
void ExtrasRun() {
print("Hayvan Çok Hızlı Koşuyor.");
}
}
class Cat implements Animal, Animal2 {
@override
int age;
@override
String name;
@override
void Eat() {
// TODO: implement Eat
}
@override
void Run() {
// TODO: implement Run
}
@override
void Sleep() {
// TODO: implement Sleep
}
@override
String extras;
@override
void ExtrasRun() {
// TODO: implement ExtrasRun
}
}
class Dog implements Animal, Animal2 {
@override
int age;
@override
String name;
@override
void Eat() {
// TODO: implement Eat
}
@override
void Run() {
// TODO: implement Run
}
@override
void Sleep() {
// TODO: implement Sleep
}
@override
String extras;
@override
void ExtrasRun() {
// TODO: implement ExtrasRun
}
}
class Cat implements Animal, Animal2 {
@override
int age;
@override
String name;
@override
void Eat() {
// TODO: implement Eat
}
@override
void Run() {
// TODO: implement Run
}
@override
void Sleep() {
// TODO: implement Sleep
}
@override
String extras;
@override
void ExtrasRun() {
// TODO: implement ExtrasRun
}
}
class Dog implements Animal, Animal2 {
@override
int age;
@override
String name;
@override
void Eat() {
// TODO: implement Eat
}
@override
void Run() {
// TODO: implement Run
}
@override
void Sleep() {
// TODO: implement Sleep
}
@override
String extras;
@override
void ExtrasRun() {
// TODO: implement ExtrasRun
}
}
İmplement ettiğinizde ilgili sınıflarınız yine hata verecektir. Bunun için yukarıda yaptığımız implementasyonu tekrarlamalısınız.
Metodlar override edilecek şekilde geldiyse artık hazırız demektir.
Burada bir dipnot. Bir sınıf sadece bir sınıftan extends edilebilir ama pek çok sınıftan implemet edilebilir demiştik.
Bu işlemler aynı anda yapılabilir mi? Evet.
class ClassName extends C1 implemts C2, C3, C4{
}
şeklinde yapılabilir.
Extend edilen sınıftaki metodların override edilmesi zorunlu değildir.
Kalıttığımız için aynen kullanabiliriz. Bunu zaten biliyorsunuz.
Bir sonraki yazımda görüşmek üzere.