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.
Görev
Kolayextends 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 birWorkersınıfı.[name] is working...yazdıran birwork()metodu ve[name] takes a coffee breakyazdıran birtakeBreak()metodu ekleyin. Workersınıfını extend eden birOfficeWorkersınıfı. BirString departmentözelliği ekleyin.work()metodunu[name] is typing reports in [department]yazdıracak şekilde geçersiz kılın (override), ancak miras alınantakeBreak()davranışını koruyun.Workersınıfını implement eden birRobotWorkersınıfı. BirString 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()metoduRobot [model] is assembling partsyazdırmalı vetakeBreak()metoduRobot [model] is rechargingyazdırmalıdır.
- Bir
main.dart: Çalışan dosyanızı içe aktarın ve her iki yaklaşımı da gösterin:'Marketing'departmanında'Alice'adında birOfficeWorkeroluşturun.'RX-7'modeline sahip birRobotWorkeroluşturun.- Ofis çalışanı için önce
work(), ardındantakeBreak()metodunu çağırın. - Boş bir satır yazdırın.
- Robot çalışan için önce
work(), ardındantakeBreak()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 rechargingKopya 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 almaimplements: "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
}
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
1OOP Temelleri
Harici DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı