37- Dart Arayüz interface implements – mixin with

Yazımızın içeriğini video olarak izleyebilirsiniz.

Dart Flutter Dersleri Arayüz interface implements – mixin with Nedir?

Arayüz – interface – implements konularını görmeden önce kalıtım, miras alma, abstract classları kısaca bir hatırlayalım ki bu konu daha iyi otursun.

Daha önce parent-child ilişkisi içerisinde bir üst sınıf (parent) oluşturuyorduk ve alt sınıflara (child) değişkenlerini fonksiyonlarını miras veriyordu.

Önceki derslerimizde parent sınıf olan bir öğrenci sınıfı tanımladık ve child sınıf olarak ilkokul, ortaokul ve lise sınıfı tanımlamıştık. Alt sınıflarımız, üst sınıftan ortak değerleri miras alıyordu.

Burada dikkat edilmesi gereken önemli husus üst sınıf ile alt sınıf arasında ortak bir ilişki vardı. Sonuç olarak ilkokul öğrencisi, ortaokul öğrencisi ve lise öğrencisi en nihayetinde bir öğrenciydi. Ortak özellikleri bu ilişki içerisinde miras alıyordu.

ikinci dikkat edilmesi gereken husus bir child sınıfın sadece bir tane üst parent sınıfı olabiliyordu.

Yine biz miras alma özelliğini extends anahtar kelimesi ile yapıyorduk.

abstract sınıf oluşturduğumuzda ise içerisindeki fonksiyonları alt sınıfların mecburi almasını override etmesini sağlıyorduk.

Bu kadar hatırlatmadan sonra konumuza gelelim.

Dart Interface – Implements Nedir?

interface arayüz demek. Normal şartlarda biz extends anahtar kelimesi ile ilişkili olan sınıfa üst sınıftan miras alıyorduk ve bu yalnızca birtane olabiliyordu. interface yapısında ise istediğimiz kadar farklı sınıflardan implements anahtar kelimesi ve sınıflar aralarına virgül koyarak alabiliyoruz.

Biz aralarında bir ilişki olmayan sınıflar da oluşturup miras almalarını sağlayabiliriz. İlişki olmayan sınıflar ne demek? Arkadaşlar aşağıda ki resme bakarsanız hareket sınıfı diye bir sınıf oluşturup içerisine kalk, hızlan ve dur fonksiyonları oluşturduk. Yine 3 tane alt sınıfımız var, Tren, Uçak ve Gemi. Bu üç sınıf aralarında ilişki bulunan taşıt sınıfından extends ile miras alacaklar. Burada şu söylenebilir, her tren bir taşıttır ve diğerleri için. Aralarında bi bağ bir ilişki var. Ancak biz her tren bir harekettir diyemeyiz. Aralarında bir ilişki yok. Böyle bir durumda implements anahtar kelimesini kullanıyoruz. implements ile üst sınıftan miras aldığımız fonksiyonlar da yine abstract class ta olduğu gibi override edilmesi mecbur olur.

dart-flutter-dersleri-arayuz-interface-implements-mixin-with-01

Dart mixin – with Nedir?

mixin anahtar kelimesi ile mixin sınıflar oluşturulurlar. with anahtar kelimesi ile miras alınması sağlanır. mixin içerisinde constructor oluşturulamaz. with anahtar kelimesi ile constructor içeren bir sınıfı with anahtar kelimesi ile kullanamayız. Birden fazla mixini yine arayüzde olduğu gibi aralarına virgül koyarak ekleyebiliriz. Yine mixin içerisinde ki fonksiyonların override edilmesi mecbur değildir ve yine mixin sınıftan bir nesne üretilemez.

mixini neden kullanıyoruz?

Biz mixin yerine normal bir class oluşturup with ile alamaz mıydık? Evet alabilirdik. Ancak bizim oluşturduğumuz classtan bir nesne üretmek gibi bir derdimiz yoksa ve içerisinde bir constructor olmayacaksa normal sınıf tanımlamak anlamsız olacaktır.

Örnekleyelim;

Dart Flutter Dersleri Arayüz interface implements – mixin with Örneklerle Açıklayalım

Yukarıda resimde bulunan tren, ucak, gemi örneğimizi kodlara dökelim.

Önce miras alacağımız, tren, uçak ve gemi sınıflarının üst sınıfı yani parenti olan taşıt sınıfını oluşturalım. Her birini ayrı bir dosya içerisinde oluşturuyorum. Gerektiğinde import ediyoruz.

Taşıt Sınıfı;

class Tasit {
  String cinsi;
  int uretimYili;
  String modeli;

  Tasit(this.cinsi, this.modeli, this.uretimYili);

  bilgiVer() {
    print("Taşıtımız $cinsi, Üretim Yılı $uretimYili, Modeli $modeli");
  }
}

Hareket adında interface Sınıf oluşturuyoruz – Alt sınıflara implements anahtar kelimesi ile alıyoruz.

Hareket sınıfından implements anahtar kelimesi ile alınca içerideki fonksiyonların hepsi alt sınıflarda mecburi override edilmesi gerekiyor. Biz istersek burada abstract sınıfta oluşturup implements ile alabiliriz.

class Hareket {
  kalk() {}

  hizlan() {}

  dur() {}
}

Durum adında mixin Sınıf oluşturuyoruz – Alt sınıflara with anahtar kelimesi ile alıyoruz.

Biz burada mixin yerine normal sınıf ta oluşturabiliriz. Ancak constructor oluşturulursa with anahtar kelimesini kullanamayız. mixinlerden nesne de üretilmez. Yani bizim bu sınıftan bir nesne üretmeye ihtiyacımız yok diye mixin oluşturuyoruz.

mixin Durum {
  yukseklik() {}
  denizRuzgari() {}
  yolcuSayisi() {}
}

Tren sınıfı oluşturup üst sınıflardan miras alacağız. implements ile aldığımız fonksiyonları mecburi olarak kendimize göre override ediyoruz ancak with ile üst sınıftan ihtiyacımız olan fonksiyonu alıp override ediyoruz.

import 'durum.dart';
import 'hareket.dart';
import 'tasit.dart';

class Tren extends Tasit with Durum implements Hareket {
  late int yolcu;

  Tren(String cinsi, String modeli, int uretimYili, this.yolcu)
      : super(cinsi, modeli, uretimYili);

  @override
  yolcuSayisi() {
    print("Tren Yolcu Sayısı $yolcu");
  }

  @override
  dur() {
    print("$cinsi durdu");
  }

  @override
  hizlan() {
    print("$cinsi hızlandı");
  }

  @override
  kalk() {
    print("$cinsi kalktı");
  }
}

Uçak sınıfı oluşturup üst sınıflardan miras alacağız. implements ile aldığımız fonksiyonları mecburi olarak kendimize göre override ediyoruz ancak with ile üst sınıftan ihtiyacımız olan fonksiyonu alıp override ediyoruz.

import 'durum.dart';
import 'hareket.dart';
import 'tasit.dart';

class Ucak extends Tasit with Durum implements Hareket {
  Ucak(String cinsi, String modeli, int uretimYili)
      : super(cinsi, modeli, uretimYili);
  late int yolcu;

  @override
  dur() {
    print("$cinsi durdu");
  }

  @override
  hizlan() {
    print("$cinsi hızlandı");
  }

  @override
  kalk() {
    print("$cinsi kalktı");
  }

  @override
  yukseklik() {
    print("ucak yeterince yukseldi");
  }

  @override
  yolcuSayisi() {
    print("Uçağımızın yolcu sayısı $yolcu");
  }
}

Evet sınıflarımız bu şekilde oluştu. main dosyamız ve main fonksiyonumuz içerisinde nesneler üretip örnek yapalım.

import 'tren.dart';
import 'ucak.dart';

void main(List<String> args) {
  Tren tren = Tren("Tren", "Yolcu Treni", 2001, 500);
  Ucak ucak = Ucak("Uçak", "boing", 2011);
  tren.yolcu = 650;
  tren.yolcuSayisi();
  tren.dur();
  tren.hizlan();
  tren.bilgiVer();

  ucak.yolcu = 800;
  ucak.kalk();
  ucak.dur();
  ucak.yolcuSayisi();
  ucak.bilgiVer();
}
/*
SONUÇ
Tren Yolcu Sayısı 650
Tren durdu
Tren hızlandı
Taşıtımız Tren, Üretim Yılı 2001, Modeli Yolcu Treni
Uçak kalktı
Uçak durdu
Uçağımızın yolcu sayısı 800
Taşıtımız Uçak, Üretim Yılı 2011, Modeli boing

*/

dart-flutter-dersleri-arayuz-interface-implements-mixin-with-03

Yorum bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir