call() Metodu
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 73 / 110.
Dart, bir nesneyi bir fonksiyonmuş gibi kullanmanıza olanak tanıyan call() adlı özel bir metoda sahiptir. Bir sınıf bir call() metodu tanımladığında, o sınıfın örneklerini fonksiyon çağırma sözdizimini kullanarak çağırabilirsiniz.
class Multiplier {
int factor;
Multiplier(this.factor);
int call(int value) {
return value * factor;
}
}
void main() {
var double = Multiplier(2);
var triple = Multiplier(3);
print(double(5)); // 10 - nesneyi bir fonksiyon gibi çağırma
print(triple(5)); // 15
}double.call(5) yazmak yerine, sadece double(5) yazabilirsiniz. Nesne üzerinde parantez kullandığınızda Dart, call() metodunu otomatik olarak çağırır.
call() metodu, tıpkı normal bir metot gibi herhangi bir parametre kabul edebilir ve herhangi bir tür döndürebilir:
class Greeter {
String prefix;
Greeter(this.prefix);
String call(String name, {String punctuation = '!'}) {
return '$prefix, $name$punctuation';
}
}
void main() {
var hello = Greeter('Hello');
print(hello('Alice')); // Hello, Alice!
print(hello('Bob', punctuation: '?')); // Hello, Bob?
}Bu desen, fonksiyon gibi davranan ancak aynı zamanda durum veya yapılandırma bilgisini koruyan nesnelere ihtiyaç duyduğunuzda kullanışlıdır. Çağrılar arasında ayarları hatırlaması gereken yeniden kullanılabilir işlemler, doğrulayıcılar veya biçimlendiriciler oluşturmak için yaygın olarak kullanılır.
Görev
KolayFormatlayıcı nesnelerin doğrudan fonksiyonlar gibi çağrılabildiği bir metin formatlama sistemi oluşturalım! Yapılandırma ayarlarını korurken metni farklı şekillerde dönüştüren çağrılabilir (callable) sınıflar oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
formatters.dart: Dizeleri dönüştüren iki çağrılabilir sınıf oluşturun:- Metni yapılandırılabilir bir ön ek (prefix) ve son ek (suffix) ile saran bir
Wrappersınıfı. Bu sınıfprefixvesuffixdizelerini saklamalıdır vecall()metodu birString textkabul edip metni ön ek ve son ek ile sarılmış halde döndürmelidir. - Metni yapılandırılabilir sayıda tekrar eden bir
Repeatersınıfı. Bu sınıf birtimestam sayısı saklamalıdır vecall()metodu birString textkabul edip metni aralarında boşluk olacak şekilde o kadar kez tekrarlanmış halde döndürmelidir.
- Metni yapılandırılabilir bir ön ek (prefix) ve son ek (suffix) ile saran bir
main.dart: Formatlayıcılarınızı içe aktarın ve bu nesnelerin tıpkı fonksiyonlar gibi nasıl kullanılabileceğini gösterin:'['ön eki ve']'son eki ile birWrapperoluşturun'***'ön eki ve'***'son eki ile başka birWrapperoluşturuntimesdeğeri3olarak ayarlanmış birRepeateroluşturun- İlk wrapper'ı
'Hello'ile çağırın ve sonucu yazdırın - İkinci wrapper'ı
'Important'ile çağırın ve sonucu yazdırın - Repeater'ı
'Go'ile çağırın ve sonucu yazdırın - İlk wrapper'ın sonucunu (
'Nested'ile) ikinci wrapper'a geçirerek zincirlemeyi gösterin ve sonucu yazdırın
Formatlayıcı nesnelerinizi tıpkı normal fonksiyonlar gibi parantez kullanarak doğrudan nasıl çağırabildiğinize dikkat edin. call() metodu bunu mümkün kılar ve her nesne kullanımlar arasında kendi yapılandırmasını hatırlar!
Beklenen çıktı:
[Hello]
***Important***
Go Go Go
***[Nested]***Kopya kağıdı
call() yöntemi, bir nesneyi sanki bir fonksiyonmuş gibi kullanmanıza olanak tanır. Bir sınıf bir call() yöntemi tanımladığında, o sınıfın örneklerini fonksiyon çağırma sözdizimini kullanarak çağırabilirsiniz.
class Multiplier {
int factor;
Multiplier(this.factor);
int call(int value) {
return value * factor;
}
}
void main() {
var double = Multiplier(2);
print(double(5)); // 10 - nesneyi bir fonksiyon gibi çağırma
}double.call(5) yazmak yerine, sadece double(5) yazabilirsiniz. Nesne üzerinde parantez kullandığınızda Dart, call() yöntemini otomatik olarak çağırır.
call() yöntemi herhangi bir parametreyi kabul edebilir ve herhangi bir türü döndürebilir:
class Greeter {
String prefix;
Greeter(this.prefix);
String call(String name, {String punctuation = '!'}) {
return '$prefix, $name$punctuation';
}
}
void main() {
var hello = Greeter('Hello');
print(hello('Alice')); // Hello, Alice!
print(hello('Bob', punctuation: '?')); // Hello, Bob?
}Bu desen, fonksiyon gibi davranan ancak aynı zamanda çağrılar arasında durum veya yapılandırma bilgisini koruyan nesneler oluşturmak için kullanışlıdır.
Kendin dene
import 'formatters.dart';
void main() {
// TODO: '[' öneki ve ']' soneki ile bir Wrapper oluşturun
// TODO: '***' öneki ve '***' soneki ile başka bir Wrapper oluşturun
// TODO: times değeri 3 olan bir Repeater oluşturun
// TODO: İlk wrapper'ı 'Hello' ile çağırın ve sonucu yazdırın
// TODO: İkinci wrapper'ı 'Important' ile çağırın ve sonucu yazdırın
// TODO: Repeater'ı 'Go' ile çağırın ve sonucu yazdırın
// TODO: İlk wrapper'ın sonucunu ('Nested' ile) ikinci wrapper'a
// geçirerek zincirlemeyi gösterin ve sonucu 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ı