Soyut Metotlar
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 44 / 110.
Soyut metot (abstract method), soyut bir sınıf (abstract class) içinde bildirilen ve gövdesi bulunmayan bir metottur. Metot imzasını tanımlar ancak uygulamanın nasıl olacağını her bir alt sınıfa (subclass) bırakır. Soyut sınıfı genişleten (extend eden) herhangi bir sınıf, tüm soyut metotları geçersiz kılmak (override) zorundadır; aksi takdirde o sınıf da soyut kalacaktır.
abstract class Animal {
// Soyut metot - gövdesi yok, alt sınıflar tarafından uygulanmalıdır
String makeSound();
// Somut metot - bir gövdesi var, tüm alt sınıflar tarafından paylaşılır
void breathe() {
print('Breathing...');
}
}
class Dog extends Animal {
@override
String makeSound() {
return 'Woof!'; // Uygulama sağlanmalıdır
}
}
class Cat extends Animal {
@override
String makeSound() {
return 'Meow!'; // Farklı uygulama, aynı imza
}
}Eğer bir alt sınıf soyut bir metodu uygulamayı unutursa, Dart size bir derleme hatası verir. Asıl amaç budur; soyut metodlar bir sözleşmeyi zorunlu kılar. Her alt sınıfın bu metoda sahip olacağı garanti edilir, böylece soyut türün herhangi bir örneği üzerinde onu güvenle çağırabilirsiniz.
// Soyut türü bir değişken türü olarak kullanabilirsiniz
Animal a = Dog();
print(a.makeSound()); // Hav!
Animal b = Cat();
print(b.makeSound()); // Miyav!Soyut metotlar, soyut bir sınıftaki somut metotlardan farklıdır. Somut metotların bir gövdesi vardır ve olduğu gibi miras alınırlar. Soyut metotların gövdesi yoktur ve geçersiz kılınmaları gerekir.
Bazı davranışları paylaşırken diğerleri için alt sınıfları kendi tanımlarını yapmaya zorlamak amacıyla her ikisini de aynı soyut sınıfta birleştirebilirsiniz.
| Özellik | Soyut Metot (Abstract Method) | Somut Metot (Concrete Method) |
|---|---|---|
| Gövdesi var mı | Hayır | Evet |
| Geçersiz kılınmalı mı | Evet | Hayır |
| Amaç | Sözleşmeyi zorunlu kılmak | Davranışı paylaşmak |
| Nerede | Sadece soyut sınıfta | Herhangi bir sınıfta |
Görev
KolaySoyut metotların işleyişini gösteren bir şekil hesaplayıcı oluşturalım. Her şeklin farklı şekilde uygulaması gereken soyut metotlara sahip bir soyut sınıf tanımlayacak ve ardından bu şekilleri ortak bir arayüz üzerinden kullanacaksınız.
Kodunuzu dört dosyada organize edeceksiniz:
shape.dart:finalbircolor(String) alanına ve bunu başlatan bir yapıcıya (constructor) sahip birShapesoyut sınıfı tanımlayın. İki soyut metot bildirin:double area()vedouble perimeter(). Ayrıca,A [color] shape with area: [area] and perimeter: [perimeter]çıktısını yazdıran somut birdescribe()metodu ekleyin.area()veperimeter()soyut olduğu için, her alt sınıf kendi hesaplamasını sağlayacaktır, ancakdescribe()metodu geçersiz kılınmadan (override) hepsi için çalışır.circle.dart:Shapesınıfını genişleten birCirclesınıfı oluşturun.finalbirradius(double) alanına sahiptir. Yapıcısıcolorveradiusalır vecolordeğerinisuper'e iletir.area()metodunu3.14 * radius * radiusdöndürecek şekilde,perimeter()metodunu ise2 * 3.14 * radiusdöndürecek şekilde uygulayın.rectangle.dart:Shapesınıfını genişleten birRectanglesınıfı oluşturun.finalwidthveheight(her ikisi de double) alanlarına sahiptir. Yapıcısıcolor,widthveheightalır vecolordeğerinisuper'e iletir.area()metodunuwidth * heightdöndürecek şekilde,perimeter()metodunu ise2 * (width + height)döndürecek şekilde uygulayın.main.dart: Tüm dosyaları içe aktarın (import).'red'renkli ve5.0yarıçaplı birCircleile'blue'renkli,4.0genişliğinde ve6.0yüksekliğinde birRectangleoluşturun. Her şekil üzerindedescribe()metodunu çağırın. Ardından her iki şekli de içeren birList<Shape>oluşturun, liste üzerinde döngü kurun ve her şekil içinArea: [area]yazdırın.
Beklenen çıktı:
A red shape with area: 78.5 and perimeter: 31.400000000000002
A blue shape with area: 24.0 and perimeter: 20.0
Area: 78.5
Area: 24.0Kopya kağıdı
Bir soyut metot (abstract method), gövdesi olmadan bir soyut sınıfta bildirilen bir metottur. Alt sınıflar, kendi uygulamalarını sağlamak için bu metodu geçersiz kılmalıdır (override).
abstract class Animal {
// Soyut metot - gövde yok
String makeSound();
// Somut metot - gövdesi var
void breathe() {
print('Breathing...');
}
}Alt sınıflar tüm soyut metotları uygulamalıdır:
class Dog extends Animal {
@override
String makeSound() {
return 'Woof!';
}
}
class Cat extends Animal {
@override
String makeSound() {
return 'Meow!';
}
}Soyut türü bir değişken türü olarak kullanabilirsiniz:
Animal a = Dog();
print(a.makeSound()); // Woof!
Animal b = Cat();
print(b.makeSound()); // Meow!| Özellik | Soyut Metot | Somut Metot |
|---|---|---|
| Gövdesi var mı | Hayır | Evet |
| Geçersiz kılınmalı mı | Evet | Hayır |
| Amaç | Sözleşmeyi zorunlu kılmak | Davranışı paylaşmak |
| Nerede | Yalnızca soyut sınıfta | Herhangi bir sınıfta |
Kendin dene
import 'shape.dart';
import 'circle.dart';
import 'rectangle.dart';
void main() {
// TODO: 'red' renkli ve 5.0 yarıçaplı bir Circle (Daire) oluşturun
// TODO: 'blue' renkli, 4.0 genişliğinde ve 6.0 yüksekliğinde bir Rectangle (Dikdörtgen) oluşturun
// TODO: Daire üzerinde describe() metodunu çağırın
// TODO: Dikdörtgen üzerinde describe() metodunu çağırın
// TODO: Her iki şekli de içeren bir List<Shape> oluşturun
// TODO: Liste üzerinde döngü kurun ve her şekil için "Area: [area]" yazdı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ı