Menu
Coddy logo textTech

Yapıcı Metotlar ve Kalıtım

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 41 / 110.

Bir alt sınıf bir üst sınıfı genişlettiğinde, kalıtılan alanları düzgün bir şekilde başlatmak için üst sınıfın kurucusu çağrılmalıdır. Dart, super kullanarak başlatıcı listesi (initializer list) aracılığıyla bunu yönetmek için esnek yollar sunar.

Eğer ebeveyn sınıfın parametreli bir kurucusu (constructor) varsa, alt sınıf bunu açıkça çağırmalıdır:

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
}

class Student extends Person {
  String school;
  
  Student(String name, int age, this.school) : super(name, age);
}

Dart 2.17, parametreleri doğrudan üst sınıf yapıcısına ileten daha temiz bir söz dizimi olan süper parametreleri (super parameters) tanıttı:

class Student extends Person {
  String school;
  
  // super.name ve super.age doğrudan Person'ın kurucusuna iletilir
  Student(super.name, super.age, this.school);
}

Adlandırılmış yapıcılarla çalışırken, hangi üst sınıf yapıcısının çağrılacağını belirtirsiniz:

class Employee extends Person {
  String department;
  
  Employee(super.name, super.age, this.department);
  
  Employee.intern(String name, this.department) : super(name, 18);
}

Temel kural basittir: Alt sınıf kendi özelliklerini eklemeden önce üst sınıfın tamamen başlatılması gerekir. İster geleneksel super() çağrısını ister daha yeni olan süper parametreleri kullanın, Dart, kalıtım zincirinin üst sınıftan alt sınıfa doğru düzgün bir şekilde oluşturulmasını sağlar.

challenge icon

Görev

Kolay

Kalıtımın yapıcılarla (constructors) nasıl çalıştığını gösteren bir ürün envanter sistemi oluşturalım. Farklı ürün türlerinin bir temel ürün sınıfını genişlettiği ve her birinin üst sınıf yapıcıları aracılığıyla düzgün bir şekilde başlatılmasını gerektiren bir hiyerarşi oluşturacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • product.dart: Ürün hiyerarşinizi burada tanımlayın:
    • String name ve double price özelliklerine sahip, her iki değeri de alan bir yapıcıya ve [name]: $[price] çıktısını veren bir info() metoduna sahip bir Product sınıfı
    • Product sınıfını genişleten ve bir String author özelliği ekleyen bir Book sınıfı. name ve price değerlerini üst sınıf yapıcısına iletmek için "super parameters" kullanın
    • Product sınıfını genişleten ve bir int warranty özelliği (ay cinsinden) ekleyen bir Electronics sınıfı. Değerleri üst sınıfa iletmek için başlatıcı listesinde (initializer list) geleneksel super() çağrısını kullanın
  • main.dart: Ürün dosyanızı içe aktarın ve her iki yapıcı kalıtımı yaklaşımını da gösterin:
    • Adı 'Dart Essentials', fiyatı 29.99 ve yazarı 'Jane Smith' olan bir Book oluşturun
    • info() metodunu çağırın, ardından Author: [author] yazdırın
    • Boş bir satır yazdırın
    • Adı 'Wireless Mouse', fiyatı 45.50 ve garantisi 24 olan bir Electronics oluşturun
    • info() metodunu çağırın, ardından Warranty: [warranty] months yazdırın

Her iki alt sınıf da info() metodunu geçersiz kılmaya (override) gerek duymadan Product sınıfından miras alır. Temel fark, üst sınıf yapıcısını nasıl çağırdıklarıdır - Book daha temiz olan "super parameters" sözdizimini kullanırken, Electronics başlatıcı listesinde super() ile geleneksel yaklaşımı kullanır.

Beklenen çıktı:

Dart Essentials: $29.99
Author: Jane Smith

Wireless Mouse: $45.5
Warranty: 24 months

Kopya kağıdı

Bir alt sınıf bir üst sınıfı genişlettiğinde (extend), devralınan alanların düzgün bir şekilde başlatılması için üst sınıfın kurucu metodunun (constructor) çağrılması gerekir.

Geleneksel yaklaşım - başlatıcı listesinde üst sınıf kurucusunu açıkça çağırmak:

class Person {
  String name;
  int age;
  
  Person(this.name, this.age);
}

class Student extends Person {
  String school;
  
  Student(String name, int age, this.school) : super(name, age);
}

Süper parametreler (Dart 2.17+) - parametreleri doğrudan üst sınıf kurucusuna iletmek:

class Student extends Person {
  String school;
  
  Student(super.name, super.age, this.school);
}

İsimlendirilmiş kurucular - hangi üst sınıf kurucusunun çağrılacağını belirtmek:

class Employee extends Person {
  String department;
  
  Employee(super.name, super.age, this.department);
  
  Employee.intern(String name, this.department) : super(name, 18);
}

Kendin dene

import 'product.dart';

void main() {
  // TODO: Şunlara sahip bir Book oluşturun:
  // - name: 'Dart Essentials'
  // - price: 29.99
  // - author: 'Jane Smith'

  // TODO: Kitabın info() metodunu çağırın

  // TODO: "Author: [author]" yazdırın

  // TODO: Boş bir satır yazdırın

  // TODO: Şunlara sahip bir Electronics oluşturun:
  // - name: 'Wireless Mouse'
  // - price: 45.50
  // - warranty: 24

  // TODO: Elektronik cihazın info() metodunu çağırın

  // TODO: "Warranty: [warranty] months" yazdırın
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler