Menu
Coddy logo textTech

Uygulamak ve Genişletmek

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

Artık hem extends hem de implements ifadelerini anladığınıza göre, her birini ne zaman kullanacağınızı netleştirelim.

Davranışı devralmak istediğinde extends kullan. Alt sınıfın üst sınıfın tüm kodunu ücretsiz olarak alır ve bunun üzerine inşa edebilir:

class Animal {
  void breathe() {
    print('Breathing...');
  }
}

class Dog extends Animal {
  void bark() {
    print('Woof!');
  }
}

void main() {
  var dog = Dog();
  dog.breathe();  // Miras alındı - otomatik olarak çalışır
  dog.bark();
}

Kodu devralmadan bir yapıyı garanti etmek istediğinde implements kullan. Her metodu kendin yazmalısın:

class Robot implements Animal {
  @override
  void breathe() {
    print('Ventilating circuits...');  // Tamamen özel uygulama
  }
}

Temel fark: extends “Ben bunun bir türüyüm” derken, implements “Bunun yaptığı şeyi yapabilirim” der. Bir Dog, bir Animal'dır ve aynı şekilde nefes alır. Bir Robot hayvan değildir, ancak kendi mantığıyla aynı sözleşmeyi yerine getirebilir.

Unutma: yalnızca bir sınıfı genişletebilirsin, ancak birçok arayüzü uygulayabilirsin. Gerçek kalıtım ilişkileri için extends seç ve esnekliğe ihtiyaç duyduğunda veya uygulama ayrıntılarını paylaşmadan bir sözleşmeyi zorunlu kılmak istediğinde implements kullan.

challenge icon

Görev

Kolay

extends ile implements kullanımının ne zaman uygun olduğunu gösteren bir çalışan sistemi oluşturalım. Bir temel çalışan sınıfı oluşturacak ve ardından her iki yaklaşımı da göstereceksin: gerçekten "bir çalışan olan" ve davranışları miras alan bir sınıf ile yalnızca bir çalışanın yaptıklarını "yapabilen", ancak tamamen özel mantığa sahip başka bir sınıf.

Kodunu iki dosyada düzenleyeceksin:

  • worker.dart: Çalışan hiyerarşini burada tanımla:
    • Worker özelliğine ve bir kurucuya sahip bir String name sınıfı. work() yazdıran bir [name] is working... metodu ve takeBreak() yazdıran bir [name] takes a coffee break metodu ekle
    • OfficeWorker sınıfını extends eden bir Worker sınıfı. String department özelliğini ekle. work() metodunu, [name] is typing reports in [department] yazdıracak şekilde geçersiz kıl; ancak miras alınan takeBreak() davranışını koru
    • RobotWorker sınıfını implements eden bir Worker sınıfı. String model özelliğini ekle. Robotlar gerçekten çalışan olmasalar da çalışanların yaptıklarını yapabildikleri için tamamen özel uygulamalar sağla: work() metodu Robot [model] is assembling parts yazdırmalı ve takeBreak() metodu Robot [model] is recharging yazdırmalı
  • main.dart: Çalışan dosyanı içe aktar ve her iki yaklaşımı da göster:
    • OfficeWorker departmanında 'Alice' adlı bir 'Marketing' oluştur
    • Modeli RobotWorker olan bir 'RX-7' oluştur
    • Ofis çalışanı için önce work(), ardından takeBreak() çağrısını yap
    • Boş bir satır yazdır
    • Robot çalışanı için önce work(), ardından takeBreak() çağrısını yap

OfficeWorker sınıfının takeBreak() sınıfını genişlettiği için Worker metodunu otomatik olarak miras aldığına dikkat et; bu sınıf gerçekten "bir çalışandır". Buna karşılık RobotWorker, yalnızca arayüzü uyguladığı için her şey için kendi uygulamasını sağlamak zorundadır; bir çalışanın yaptıklarını "yapabilir", ancak bunu kendi robotik tarzında gerçekleştirir.

Beklenen çıktı:

Alice is typing reports in Marketing
Alice takes a coffee break

Robot RX-7 is assembling parts
Robot RX-7 is recharging

Kendin dene

import 'worker.dart';

void main() {
  // TODO: 'Marketing' departmanında 'Alice' adında bir OfficeWorker oluştur
  
  // TODO: 'RX-7' modeline sahip bir RobotWorker oluştur
  
  // TODO: Ofis çalışanı için work() sonra takeBreak() çağır
  
  // TODO: Boş bir satır yazdır
  
  // TODO: Robot çalışanı için work() sonra takeBreak() çağır
}
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

Kendi başına pratik yap: Online Dart derleyicisi