Menu
Coddy logo textTech

@override Anotasyonu

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

@override anotasyonu, Dart'a (ve diğer geliştiricilere) bir üst sınıftan bir metodu kasıtlı olarak değiştirdiğinizi söyleyen en iyi uygulama işaretçisidir. Metot geçersiz kılma bu olmadan da çalışsa da, @override kullanmak önemli bir güvenlik ağı ekler.

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

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

Anotasyon iki temel fayda sağlar. İlk olarak, niyetinizi açıkça belgeler; kodu okuyan herkes bu metodun üst sınıfta mevcut olduğunu anında anlar. İkinci olarak, üst metot aslında mevcut değilse Dart'ın çözümleyicisi (analyzer) sizi uyararak yazım hatalarını ve yeniden yapılandırma (refactoring) hatalarını erkenden yakalar.

@override kullanmadan metot adını yanlış yazarsanız ne olacağını bir düşünün:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speek() {  // Yazım hatası! @override olmadan uyarı yok
    print('$name meows');
  }
}

Anotasyon olmadan, Dart speek() adında yeni bir metot oluşturduğunuzu varsayar. @override ile analizör, üst sınıfta böyle bir metodun bulunmadığını hemen işaret eder. Bu basit anotasyon, daha sonra tespit edilmesi zor olabilecek sinsi hataları önler.

challenge icon

Görev

Kolay

Kalıtılan davranışı özelleştirirken @override anotasyonunun önemini gösteren bir medya oynatıcı sistemi oluşturalım. Her biri içeriği kendi yöntemiyle oynatan farklı medya türleri oluşturacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • media.dart: Medya hiyerarşinizi burada tanımlayın:
    • Bir String title özelliğine, başlığı alan bir kurucuya (constructor) ve Playing: [title] yazdıran bir play() metoduna sahip bir Media sınıfı
    • Media sınıfını genişleten ve bir String artist özelliği ekleyen bir Song sınıfı. @override anotasyonunu kullanın ve Playing song: [title] by [artist] yazdırmak için play() metodunu geçersiz kılın (override)
    • Media sınıfını genişleten ve bir int duration (saniye cinsinden) özelliği ekleyen bir Video sınıfı. @override kullanın ve önce super.play() ile üst sınıfın versiyonunu çağırmak, ardından Duration: [duration] seconds yazdırmak için play() metodunu geçersiz kılın
  • main.dart: Medya dosyanızı içe aktarın ve geçersiz kılınan (overridden) metodları gösterin:
    • Başlığı 'Generic Content' olan bir Media nesnesi oluşturun ve play() metodunu çağırın
    • Boş bir satır yazdırın
    • Başlığı 'Imagine' ve sanatçısı 'John Lennon' olan bir Song oluşturun, ardından play() metodunu çağırın
    • Boş bir satır yazdırın
    • Başlığı 'Dart Tutorial' ve süresi 360 olan bir Video oluşturun, ardından play() metodunu çağırın

@override anotasyonu niyetinizi belgeler ve hataları yakalamaya yardımcı olur. Eğer yanlışlıkla play() metodunu plya() olarak yazarsanız, anotasyon sizi üst sınıfta böyle bir metodun bulunmadığı konusunda uyaracaktır.

Beklenen çıktı:

Playing: Generic Content

Playing song: Imagine by John Lennon

Playing: Dart Tutorial
Duration: 360 seconds

Kopya kağıdı

@override anotasyonu, bir üst sınıf metodunu kasıtlı olarak geçersiz kılan metodları işaretler. İsteğe bağlı olsa da, güvenlik ve netlik sağlar.

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

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

@override kullanmanın avantajları:

  • Niyeti belgeler - metodun üst sınıfta mevcut olduğunu gösterir
  • Hataları yakalar - Dart'ın çözümleyicisi (analyzer), üst sınıf metodu mevcut değilse uyararak yazım hatalarını önler

@override olmadan, yazım hataları hata bildirmek yerine yeni metodlar oluşturur:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speek() {  // Yazım hatası uyarı vermeden yeni bir metod oluşturur
    print('$name meows');
  }
}

super kullanarak üst sınıfın versiyonunu çağırabilirsiniz:

@override
void play() {
  super.play();  // Önce üst sınıf metodunu çağır
  print('Additional behavior');
}

Kendin dene

import 'media.dart';

void main() {
  // TODO: Başlığı 'Generic Content' olan bir Media nesnesi oluşturun ve play() fonksiyonunu çağırın
  
  
  // TODO: Boş bir satır yazdırın
  
  
  // TODO: Başlığı 'Imagine' ve sanatçısı 'John Lennon' olan bir Song nesnesi oluşturun, ardından play() fonksiyonunu çağırın
  
  
  // TODO: Boş bir satır yazdırın
  
  
  // TODO: Başlığı 'Dart Tutorial' ve süresi 360 olan bir Video nesnesi oluşturun, ardından play() fonksiyonunu ç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