noSuchMethod Geçersiz Kılma
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 74 / 110.
Bir nesne üzerinde mevcut olmayan bir metodu çağırdığınızda, Dart normalde bir NoSuchMethodError fırlatır. Ancak, bu çağrıları yakalamak ve onları düzgün bir şekilde ele almak için özel noSuchMethod() metodunu geçersiz kılabilirsiniz.
noSuchMethod() kullanmak için, sınıfınızın ayrıca bir arayüz uygulaması veya dynamic yazımını kullanması gerekir.
Metot, yapılan çağrıyla ilgili ayrıntıları içeren bir Invocation nesnesi alır:
class Flexible {
@override
dynamic noSuchMethod(Invocation invocation) {
var methodName = invocation.memberName.toString();
print('Called: $methodName');
return null;
}
}
void main() {
dynamic obj = Flexible();
obj.anyMethod(); // Çağrıldı: Symbol("anyMethod")
obj.anotherOne(42); // Çağrıldı: Symbol("anotherOne")
}Invocation nesnesi çağrı hakkında yararlı bilgiler sağlar - memberName size yöntem adını bir Symbol olarak verir, positionalArguments geçirilen argümanları içerir ve isMethod bunun bir getter veya setter yerine bir yöntem çağrısı olup olmadığını söyler.
class Logger {
@override
dynamic noSuchMethod(Invocation invocation) {
print('Method: ${invocation.memberName}');
print('Args: ${invocation.positionalArguments}');
return 'handled';
}
}
void main() {
dynamic log = Logger();
var result = log.save('data', 123);
print(result); // handled
}Bu teknik, proxy nesneleri oluşturmak, test için mock sınıfları hazırlamak veya rastgele yöntem çağrılarına yanıt veren esnek API'ler geliştirmek için kullanışlıdır. Ancak derleme zamanı tür denetimini devre dışı bıraktığı için ölçülü kullanın.
Görev
KolayBir nesne üzerinde yapılan tüm metot çağrılarını yakalayıp kaydeden bir metot günlükleyicisi oluşturalım! Tanımsız metot çağrıları hakkında bilgi yakalamak ve metot adına göre akıllıca yanıt vermek için noSuchMethod() kullanan bir sınıf oluşturacaksın.
Kodunu iki dosyaya ayıracaksın:
method_logger.dart: Tanımsız metotlara yapılan çağrıları yakalayan birMethodLoggersınıfı oluştur. Günlükleyicin, şunları yapmak içinnoSuchMethod()metodunu geçersiz kılmalı:- Çağrıdan metot adını çıkar (bu ad,
Symbol("methodName")gibi bir Symbol olacaktır — onu bir dizeye dönüştürmen ve yalnızca adı çıkarman gerekir) - Metot adını ve tüm konumsal bağımsız değişkenleri şu biçimde yazdır:
Called: [methodName] with args: [arguments] - Metot adına göre özel bir yanıt döndür:
- Metot adı
getiçeriyorsa'data retrieved'dizesini döndür - Metot adı
saveiçeriyorsa'data saved'dizesini döndür - Aksi takdirde
'unknown action'dizesini döndür
- Metot adı
- Çağrıdan metot adını çıkar (bu ad,
main.dart: Günlükleyicini içe aktar ve çeşitli tanımsız metot çağrılarını nasıl ele aldığını göster. Dart'ın var olmayan metotların çağrılmasına izin vermesi içindynamictürünü kullanmayı unutma:- Bir dinamik değişken kullanarak bir
MethodLoggerörneği oluştur - Üzerinde
getUserData('Alice', 42)çağrısını yap ve döndürülen sonucu yazdır - Üzerinde
saveRecord('important')çağrısını yap ve döndürülen sonucu yazdır - Üzerinde
processItem()çağrısını yap (bağımsız değişken yok) ve döndürülen sonucu yazdır
- Bir dinamik değişken kullanarak bir
Bir Symbol'den metot adını çıkarmak için onu bir dizeye dönüştürebilir ve ardından tırnak işaretleri arasındaki adı ayrıştırabilirsin. Örneğin, Symbol("myMethod").toString() ifadesi sana 'Symbol("myMethod")' sonucunu verir.
Beklenen çıktı:
Called: getUserData with args: [Alice, 42]
data retrieved
Called: saveRecord with args: [important]
data saved
Called: processItem with args: []
unknown actionKendin dene
import 'method_logger.dart';
void main() {
// TODO: Dinamik tipleme kullanarak bir MethodLogger örneği oluşturun
// dynamic kullanmak, derleme zamanında mevcut olmayan metotların çağrılmasına olanak tanır
dynamic logger;
// TODO: getUserData('Alice', 42) metodunu çağırın ve sonucu yazdırın
// TODO: saveRecord('important') metodunu çağırın ve sonucu yazdırın
// TODO: processItem() metodunu argüman olmadan çağırın 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
1Nesne Tabanlı Programlamanın Temelleri
Harici DosyalarKütüphaneler ve İçe AktarmalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar SözcüğüMetotlarÖrnek DeğişkenleriYapıcıların TemelleriTekrar - Basit Hesap Makinesi4Null Güvenliği
Null Güvenliğine GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Sözcüğü ve Null GüvenliğiNull-Aware OperatörlerSınıflarda Null GüvenliğiTekrar - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulamak ve GenişletmekBirden Çok ArayüzTekrar - Şekil Hesaplayıcı10Koleksiyonlar ve Generics
List, Set, Map Genel BakışTür Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorTekrar - Generic Depolama2Dart'ta Yapıcılar
Varsayılan YapıcıAdlandırılmış YapıcılarBaşlatıcı ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Ön Ek KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DerinliğiBilgi GizlemeTekrar - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Çok Mixin KullanımıMixin'lerde on Anahtar SözcüğüMixin ve Kalıtım KarşılaştırmasıMixin ve Arayüz KarşılaştırmasıÖzet - Hayvan Sistemi11Özel Metotlar
toString() Geçersiz KılmahashCode & == Geçersiz KılmaComparable Arayüzücall() MetodunoSuchMethod Geçersiz KılmaÖzet - Özel Koleksiyon14Tasarım Desenleri Bölüm 1
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy Deseni3Sınıf Özellikleri
Örnek ve Static ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatic Metotlar ve AlanlarGetter ve Setter'larÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar SözcüğüMetot Geçersiz Kılma@override Açıklamasıfinal Sınıf Anahtar SözcüğüKurucular ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriArayüzler Yoluyla Çok BiçimlilikÇalışma Zamanı Tür Denetimiis ve as OperatörleriCovariant Anahtar KelimesiTekrar - Ödeme İşlemcisi12Asenkron OOP
Future'ler ve async/awaitStream TemelleriStream DenetleyicileriAsenkron YapıcılarSınıf Metotlarında AsenkronlukÖzet - Veri Getirici15Tasarım Desenleri Bölüm 2
Komut DeseniAdaptör DeseniDekoratör DeseniŞablon Metot DeseniDurum DeseniBileşik DesenDepo DeseniKendi başına pratik yap: Online Dart derleyicisi