Menu
Coddy logo textTech

super Anahtar Kelimesi

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

super anahtar kelimesi, bir alt sınıfa üst sınıfına doğrudan erişim sağlar. Bunu zaten super(name) ile yapıcı metotlarda (constructors) görmüştünüz, ancak diğer bağlamlarda da kullanışlıdır.

Üst sınıfın (parent) kurucusunu çağırmanız gerektiğinde, super argümanları kalıtım zinciri boyunca yukarı aktarır:

class Vehicle {
  String brand;
  int year;
  
  Vehicle(this.brand, this.year);
}

class Car extends Vehicle {
  int doors;
  
  Car(String brand, int year, this.doors) : super(brand, year);
}

super anahtar kelimesi ayrıca alt sınıf içinden üst sınıf yöntemlerine ve özelliklerine erişmenizi sağlar. Bu, özellikle üst sınıfın davranışını kendi davranışınızla birlikte kullanmak istediğinizde yararlıdır:

class Animal {
  String name;
  
  Animal(this.name);
  
  void makeSound() {
    print('$name makes a sound');
  }
}

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void makeSound() {
    super.makeSound();  // Önce üst sınıfın yöntemini çağır
    print('$name says meow!');
  }
}

super.makeSound() çağırdığınızda, metodun üst sınıftaki (parent) versiyonunu açıkça çağırmış olursunuz. super olmadan, makeSound() çağırmak mevcut sınıfın metoduna atıfta bulunur ve bu da potansiyel olarak sonsuz özyinelemeye (recursion) neden olabilir.

super ifadesini; ister bir yapıcı (constructor), metot veya özellik olsun, "ebeveynimin versiyonunu kullan" demek olarak düşünün.

challenge icon

Görev

Kolay

super anahtar kelimesinin, alt sınıfların üst sınıflarının davranışlarına nasıl erişmesine ve bunları genişletmesine olanak tanıdığını gösteren bir mesajlaşma sistemi oluşturalım. Farklı mesaj türlerinin temel bir mesaj sınıfı üzerine inşa edildiği bir hiyerarşi oluşturacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • message.dart: Mesaj sınıflarınızı burada tanımlayın:
    • String sender ve String content özelliklerine sahip bir Message sınıfı (üst sınıf). Her iki değeri de alan bir yapıcı (constructor) ve From [sender]: [content] çıktısını veren bir display() metodu ekleyin.
    • Message sınıfını genişleten bir UrgentMessage sınıfı. Ek bir String priority özelliğine sahip olmalıdır. Yapıcı; sender, content ve priority değerlerini alır ve ilk ikisini super kullanarak üst sınıfa iletir. display() metodunu, önce super.display() kullanarak üst sınıfın versiyonunu çağıracak, ardından bir sonraki satıra Priority: [priority] yazdıracak şekilde geçersiz kılın (override).
  • main.dart: Mesaj dosyanızı içe aktarın ve super anahtar kelimesinin hem yapıcılarda hem de metotlarda nasıl çalıştığını gösterin:
    • 'Alice' tarafından gönderilen, içeriği 'Hello there!' olan normal bir Message oluşturun.
    • Bu nesnenin display() metodunu çağırın.
    • Ayırmak için boş bir satır yazdırın.
    • 'Bob' tarafından gönderilen, içeriği 'Server is down!' ve önceliği 'HIGH' olan bir UrgentMessage oluşturun.
    • Bu nesnenin display() metodunu çağırın.

UrgentMessage sınıfının super anahtar kelimesini iki şekilde nasıl kullandığına dikkat edin: Yapıcıda verileri üst sınıfa iletmek için ve geçersiz kılınan metotta kendi çıktısını eklemeden önce üst sınıfın çıktısını dahil etmek için.

Beklenen çıktı:

From Alice: Hello there!

From Bob: Server is down!
Priority: HIGH

Kopya kağıdı

super anahtar kelimesi, bir alt sınıfın içinden bir üst sınıfa erişim sağlar.

Üst sınıfın yapıcı metoduna argüman aktarmak için bir alt sınıf yapıcı metodunda super() kullanın:

class Vehicle {
  String brand;
  int year;
  
  Vehicle(this.brand, this.year);
}

class Car extends Vehicle {
  int doors;
  
  Car(String brand, int year, this.doors) : super(brand, year);
}

Geçersiz kılınan (overridden) metotların içinden üst sınıf metotlarını çağırmak için super kullanın:

class Animal {
  String name;
  
  Animal(this.name);
  
  void makeSound() {
    print('$name makes a sound');
  }
}

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void makeSound() {
    super.makeSound();  // Önce üst sınıfın metodunu çağır
    print('$name says meow!');
  }
}

super olmadan, bir metot adını doğrudan çağırmak mevcut sınıfın versiyonuna atıfta bulunur; bu da geçersiz kılınan metotlarda sonsuz özyinelemeye (infinite recursion) neden olabilir.

Kendin dene

import 'message.dart';

void main() {
  // TODO: 'Alice'den 'Hello there!' içerikli normal bir Message oluşturun
  
  // TODO: Mesaj üzerinde display() metodunu çağırın
  
  // TODO: Ayırmak için boş bir satır yazdırın
  
  // TODO: 'Bob'dan 'Server is down!' içerikli ve 'HIGH' öncelikli bir UrgentMessage oluşturun
  
  // TODO: Acil mesaj üzerinde display() metodunu çağı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