Menu
Coddy logo textTech

Uygulama vs. Genişletme

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 kavramlarını anladığınıza göre, her birini ne zaman kullanacağımızı netleştirelim.

Davranışı miras almak istediğinizde extends kullanın. Alt sınıfınız, üst sınıfın tüm kodunu doğrudan alır ve bunun üzerine eklemeler yapabilir:

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();
}

Kod devralmadan bir yapıyı garanti etmek istediğinizde implements kullanın. Her metodu kendiniz yazmalısınız:

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

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

Unutmayın: Yalnızca bir sınıfı genişletebilirsiniz, ancak birçok arayüzü uygulayabilirsiniz. Gerçek kalıtım ilişkileri için extends kullanın; esnekliğe ihtiyaç duyduğunuzda veya uygulama ayrıntılarını paylaşmadan bir sözleşmeyi zorunlu kılmak istediğinizde ise implements kullanın.

challenge icon

Görev

Kolay

extends ile implements yapılarının ne zaman kullanılacağını gösteren bir çalışan sistemi kuralım. Bir temel çalışan sınıfı oluşturacak ve ardından her iki yaklaşımı da göstereceksiniz: biri gerçekten bir çalışan "olan" ve davranışları miras alan bir sınıf, diğeri ise sadece bir çalışanın yaptıklarını "yapabilen" ancak tamamen özel bir mantığa sahip olan bir sınıf.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • worker.dart: Çalışan hiyerarşinizi burada tanımlayın:
    • Bir String name özelliğine ve bir yapıcıya (constructor) sahip bir Worker sınıfı. [name] is working... yazdıran bir work() metodu ve [name] takes a coffee break yazdıran bir takeBreak() metodu ekleyin.
    • Worker sınıfını extend eden bir OfficeWorker sınıfı. Bir String department özelliği ekleyin. work() metodunu [name] is typing reports in [department] yazdıracak şekilde geçersiz kılın (override), ancak miras alınan takeBreak() davranışını koruyun.
    • Worker sınıfını implement eden bir RobotWorker sınıfı. Bir String model özelliği ekleyin. Robotlar aslında insan çalışanlar olmadıkları halde çalışanların yaptıklarını yapabildikleri için, tamamen özel uygulamalar sağlayın: work() metodu Robot [model] is assembling parts yazdırmalı ve takeBreak() metodu Robot [model] is recharging yazdırmalıdır.
  • main.dart: Çalışan dosyanızı içe aktarın ve her iki yaklaşımı da gösterin:
    • 'Marketing' departmanında 'Alice' adında bir OfficeWorker oluşturun.
    • 'RX-7' modeline sahip bir RobotWorker oluşturun.
    • Ofis çalışanı için önce work(), ardından takeBreak() metodunu çağırın.
    • Boş bir satır yazdırın.
    • Robot çalışan için önce work(), ardından takeBreak() metodunu çağırın.

OfficeWorker sınıfının Worker sınıfını genişlettiği (extends) için takeBreak() metodunu nasıl otomatik olarak miras aldığına dikkat edin - o gerçekten bir çalışandır. Öte yandan, RobotWorker sadece arayüzü uyguladığı (implements) için her şey için kendi uygulamasını sağlamalıdır - bir çalışanın yaptıklarını "yapabilir", ancak bunu kendi robotik yöntemiyle yapar.

Beklenen çıktı:

Alice is typing reports in Marketing
Alice takes a coffee break

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

Kopya kağıdı

Bir üst sınıftan davranış miras almak için extends kullanın. Alt sınıf, tüm üst sınıf metotlarını otomatik olarak alır ve bunları geçersiz kılabilir (override):

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

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

void main() {
  var dog = Dog();
  dog.breathe();  // Otomatik olarak miras alındı
  dog.bark();
}

Kod miras almadan bir yapıyı garanti etmek için implements kullanın. Her metot için kendi uygulamanızı (implementation) sağlamalısınız:

class Robot implements Animal {
  @override
  void breathe() {
    print('Ventilating circuits...');
  }
}

Temel farklar:

  • extends: "Ben bunun bir türüyüm" - paylaşılan kod ile gerçek miras alma
  • implements: "Bunun yaptığını yapabilirim" - özel mantıkla bir sözleşmeyi zorunlu kılar
  • Yalnızca bir sınıfı genişletebilirsiniz (extend), ancak birden fazla arayüzü uygulayabilirsiniz (implement)

Davranışın miras alınması gereken gerçek ebeveyn-çocuk ilişkileri için extends seçin. Esnekliğe ihtiyaç duyduğunuzda veya uygulamayı paylaşmadan bir sözleşmeyi zorunlu kılmak istediğinizde implements seçin.

Kendin dene

import 'worker.dart';

void main() {
  // TODO: 'Marketing' departmanında 'Alice' adında bir OfficeWorker oluşturun
  
  // TODO: 'RX-7' modelli bir RobotWorker oluşturun
  
  // TODO: Ofis çalışanı için work() ve ardından takeBreak() metodlarını çağırın
  
  // TODO: Boş bir satır yazdırın
  
  // TODO: Robot çalışan için work() ve ardından takeBreak() metodlarını ç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