Menu
Coddy logo textTech

Metot Ezme

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

Metot geçersiz kılma (Method overriding), bir alt sınıfın, üst sınıfta zaten mevcut olan bir metodun kendi uygulamasını sunmasıyla gerçekleşir. Bu, alt sınıfların aynı metot imzasını korurken devralınan davranışı özelleştirmesine olanak tanır.

Bir alt sınıfta, üst sınıftakiyle aynı isim ve parametrelere sahip bir metot tanımladığınızda, alt sınıfın sürümü öncelik kazanır:

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

class Dog extends Animal {
  Dog(String name) : super(name);
  
  void speak() {
    print('$name barks: Woof!');
  }
}

void main() {
  var animal = Animal('Generic');
  var dog = Dog('Buddy');
  
  animal.speak();  // Generic bir ses çıkarır
  dog.speak();     // Buddy havlar: Woof!
}

Bir Dog örneği üzerinde speak() metodunu çağırdığınızda, Dart Animal'ınkini değil, Dog'un versiyonunu yürütür. Alt sınıf, üst sınıfın metodunu geçersiz kılmıştır (overridden).

Ebeveynin davranışını değiştirmek yerine genişletmek için geçersiz kılmayı (overriding) super ile de birleştirebilirsiniz:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speak() {
    super.speak();  // Önce ebeveynin versiyonunu çağır
    print('$name also purrs');
  }
}

Bu desen, mevcut işlevsellik üzerine inşa etmenize olanak tanır. Temel kural basittir: alt sınıftaki aynı metot adı ve parametreler, alt sınıf örnekleri üzerinde çağrıldığında üst sınıfın uygulamasının yerini alır.

challenge icon

Görev

Kolay

Alt sınıfların davranışı özelleştirmek için üst sınıf metotlarını nasıl geçersiz kılabileceğini (override) gösteren bir bildirim sistemi oluşturalım. Her biri mesajları kendine özgü bir şekilde ileten farklı bildirim türleri oluşturacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • notification.dart: Bildirim hiyerarşinizi burada tanımlayın:
    • String title ve String message özelliklerine sahip bir Notification sınıfı (üst sınıf). Her iki değeri de alan bir yapıcı (constructor) ve Notification: [title] - [message] çıktısını veren bir send() metodu ekleyin.
    • Notification sınıfını genişleten ve bir String recipient özelliği ekleyen bir EmailNotification sınıfı. send() metodunu, Sending email to [recipient]: [title] - [message] çıktısını verecek şekilde geçersiz kılın.
    • Notification sınıfını genişleten ve bir String deviceId özelliği ekleyen bir PushNotification sınıfı. send() metodunu, önce super kullanarak üst sınıfın send() metodunu çağıracak, ardından bir sonraki satıra Pushed to device: [deviceId] yazdıracak şekilde geçersiz kılın.
  • main.dart: Bildirim dosyanızı içe aktarın ve metot geçersiz kılma işlemini uygulamalı olarak gösterin:
    • Başlığı 'Alert' ve mesajı 'System update available' olan temel bir Notification oluşturun.
    • send() metodunu çağırın.
    • Boş bir satır yazdırın.
    • Başlığı 'Welcome', mesajı 'Thanks for signing up!' ve alıcısı 'user@example.com' olan bir EmailNotification oluşturun.
    • send() metodunu çağırın.
    • Boş bir satır yazdırın.
    • Başlığı 'Reminder', mesajı 'Meeting in 10 minutes' ve deviceId'si 'DEVICE-001' olan bir PushNotification oluşturun.
    • send() metodunu çağırın.

EmailNotification sınıfının üst sınıfın davranışını tamamen nasıl değiştirdiğine, PushNotification sınıfının ise önce super.send() çağrısı yaparak bu davranışı nasıl genişlettiğine dikkat edin. Her iki yaklaşım da ihtiyaçlarınıza bağlı olarak metotları geçersiz kılmanın geçerli yollarıdır.

Beklenen çıktı:

Notification: Alert - System update available

Sending email to user@example.com: Welcome - Thanks for signing up!

Notification: Reminder - Meeting in 10 minutes
Pushed to device: DEVICE-001

Kopya kağıdı

Metot geçersiz kılma (method overriding), bir alt sınıfın, üst sınıfta zaten mevcut olan bir metodun kendi uygulamasını sunmasıyla gerçekleşir. Alt sınıfın sürümü, alt sınıf örnekleri üzerinden çağrıldığında üst sınıfınkinin yerini alır.

Bir metodu geçersiz kılmak için, onu alt sınıfta aynı isim ve parametrelerle tanımlayın:

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

class Dog extends Animal {
  Dog(String name) : super(name);
  
  void speak() {
    print('$name barks: Woof!');
  }
}

void main() {
  var animal = Animal('Generic');
  var dog = Dog('Buddy');
  
  animal.speak();  // Generic makes a sound
  dog.speak();     // Buddy barks: Woof!
}

Davranışı tamamen değiştirmek yerine genişletmek amacıyla üst sınıfın sürümünü çağırmak için super kullanabilirsiniz:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speak() {
    super.speak();  // Önce üst sınıfın sürümünü çağır
    print('$name also purrs');
  }
}

Kendin dene

import 'notification.dart';

void main() {
  // TODO: 'Alert' başlıklı ve 'System update available' mesajlı bir temel Notification oluşturun
  // Bunun send() metodunu çağırın

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

  // TODO: Şunlara sahip bir EmailNotification oluşturun:
  // - title: 'Welcome'
  // - message: 'Thanks for signing up!'
  // - recipient: 'user@example.com'
  // Bunun send() metodunu çağırın

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

  // TODO: Şunlara sahip bir PushNotification oluşturun:
  // - title: 'Reminder'
  // - message: 'Meeting in 10 minutes'
  // - deviceId: 'DEVICE-001'
  // Bunun send() 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