36- Dart Fonksiyonel Sınıflar – Abstract Class

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

Daha önce nesne yönelimli programlamaya giriş yazımızda aşağıdaki gibi bir tanımlama yapmıştık.

Abstraction (Soyutlama)

Farklı farklı tanımları olmakla birlikte programlama dili açısından bakarsak; Oluşturacağımız nesnenin değişkenlerini, fonksiyonlarını ayrı bir sınıf tanımlayarak, ona aktarmak ve programımızın ana akışı içerisinden ayırmak, soyutlamak.

Yine bir başka kaynakta Oğuz Aslantürk’ ün Java ile Nesne Yönelimli Programlama kitabında “Gerçek hayattaki problemleri bilgisayarın sanal ortamında çözebilmek için, herşeyden önce problemin uygun şekilde bilgisayar ortamına aktarılması gerekmektedir. Bu işlem “soyutlama (abstraction)” ya da “modelleme (modeling)” olarak anılır.” denmiş.

Abstract Class – Soyut Sınıf Nedir?

Kısaca bir tanımlama yapalım sonra detaylı örneklerle birlikte açıklamasını yaparız.

Abstract class lar içerisindeki fonksiyonları, ondan miras alan alt sınıflara dayatırlar. İçerisindeki fonksiyonlar alt sınıflarda kullanılması zorunlu olur.

Biz daha önceki “33 – Dart Flutter Dersleri Inheritance Kalıtım Miras Alma” dersimizde ki örneğimizde; parent yani üst sınıf olan bir öğrenci sınıfı yaptık ve yine ondan miras alan child sınıflar olan ilkokul, ortaokul ve lise sınıflarımızı vardı. İlkokul sınıfımıza etkinlik diye bir fonksiyon ekledik, yine ortaokul sınıfımıza kulüp ve lise sınıfımıza da seçmeli ders diye ekledik. Eğer bu örnekte bunu uygularsak, ana sınıfımız olan parent sınıf yani öğrenci sınıfı içerisine aktivite diye bir fonksiyon eklesek ve alt sınıflarda bunun doldurulmasını mecbur bıraksak. Alt sınıflarda bu aktivite fonksiyonunu kendilerine göre etkinlik, kulüp ve secmeli ders bilgilerini girmek zorunda kalsalar.

Yine öğrenci sınıfı üzerinden farklı bir senaryo; Biz ilkokul, ortaokul ve lisenin not ortalamalarının farklı farklı hesaplandığını varsayalım. Her bir alt sınıfın notortalama fonksiyonunu kullanması mecburi olsun ama her birinde de farklı hesaplamalar olsun. O zaman biz miras alınan öğrenci sınıfında bunu tanımlasak ve alt sınıflara dayatsak.

Yine bir başka dersimiz olan 34 – Dart Flutter Dersleri Polymorphism – Çok Biçimlilik dersimizde şekil diye bir üst sınıf oluşturduk. Yine child olan ücgen, kare ve dikdörtgen alt sınıfları oluşturmuştuk. Burada üst sınıfımızda yani şekil sınıfımızda yükseklik ve genişlik değerleri almıştık. Yine içerisine alanhesapla diye genişlik ve yüksekliği çarpıp geri döndüren bir fonksiyon yazmıştık. Bu fonksiyonumuz kare ve dikdörtgende doğru çalışmıştı ancak üçgende doğru çalışmamıştı. Bizde üçgen sınıfı içerisinde alanhesapla fonksiyonunu override edip kendimize göre uyarlamıştık.

Burada ki önemli fark biz alanhesapla fonksiyonunu zorunlu kılmamıştık. Şimdi onu zorunlu kılmak istediğimizi düşünelim. Her bir sınıfı oluşturduğumuzda alanhesapla fonksiyonu zorunlu olarak gelsin ve biz onu kendimize göre uyarlıyalım.

Bazen bir sürü önemli fonksiyon olabilir ve bunu alt sınıflarda unutulmasın diye zorunlu kılmak isteyebiliriz.

Soyut bir fonksiyon yanında süslü parantezleri olmadan tanımlanır. Sınıf içinde tanımlanmaları, alt sınıflara mecburi tutulmasıdır.

İşte bu fonksiyonlara abstract function yani soyut fonksiyon denir. Soyut fonksiyonları kullanabilmek için soyut sınıflar, abstract class oluşturmamız gerekiyor.

Örnekleyelim;

Abstract Class – Soyut Sınıf Nasıl Tanımlanır?

Abstract Function – Soyut Fonksiyon Nasıl Tanımlanır?

Soyut sınıf tanımlayalım;

abstract class Sekil {
  // class öncesinde abstract yazdık
  // abstract (soyut)  fonksiyon oluşturabilmek için
  // abstract sınıf tanımlamalıyız.

  double yukseklik;
  double genislik;
  Sekil(this.yukseklik, this.genislik);

/*   double alanHesapla() {
    return yukseklik * genislik;
  } */ 
  //bu eski fonksiyonumuzdu ve abstract değildi
  //bu yüzden bunu child sınıflara mecburi tutamıyorduk

  double alanHesapla();
  //Süslü parantezler yok
  //abstract fonksiyon tanımladık
  //alt sınıflarda mecburi oldu
}
dart-flutter-dersleri-fonksiyonel-siniflar-abstract-class-02

Yukarıda ki resimde sınıfımızı oluştururken hata verdi, bir adet fonksiyonu eklememiz gerektiğini söyledi.

Aşağıda fonksiyonu eklediğimiz hali.

import 'sekil.dart';

class Kare extends Sekil {
  Kare(double yukseklik, double genislik) : super(genislik, yukseklik);

  @override//bilgi amaçlı override ettiğimizi söylüyor
  //artık alan hesapla fonksiyonunu mecbur ekledik
  //yoksa sınıfımız hata veriyordu.

  double alanHesapla() {
    return yukseklik * genislik;
  }
}

Üçgen sınıfı için de oluşturalım ve eklemek zorunda olduğumuz fonksiyonu kendimize göre uyarlayalım.

import 'sekil.dart';

class Ucgen extends Sekil {
  Ucgen(double yukseklik, double genislik) : super(yukseklik, genislik);

  @override
  double alanHesapla() {
    return (yukseklik * genislik) / 2;
  }
}
dart-flutter-dersleri-fonksiyonel-siniflar-abstract-class-03

Artık ana dosyamızda main fonksiyonu içerisinde kullanabiliriz.

import 'kare.dart';
import 'ucgen.dart';

void main(List<String> args) {
  Kare kare = Kare(10, 10);
  print(kare.alanHesapla());

  Ucgen ucgen = Ucgen(10, 10);
  print(ucgen.alanHesapla());
}
/*
SONUÇ
100.0
50.0

*/
dart-flutter-dersleri-fonksiyonel-siniflar-abstract-class-04

Yorum bırakın

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