Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Formatlayı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 Wrapper sınıfı. Bu sınıf prefix ve suffix dizelerini saklamalıdır ve call() metodu bir String text kabul edip metni ön ek ve son ek ile sarılmış halde döndürmelidir.
    • Metni yapılandırılabilir sayıda tekrar eden bir Repeater sınıfı. Bu sınıf bir times tam sayısı saklamalıdır ve call() metodu bir String text kabul edip metni aralarında boşluk olacak şekilde o kadar kez tekrarlanmış halde döndürmelidir.
  • 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 bir Wrapper oluşturun
    • '***' ön eki ve '***' son eki ile başka bir Wrapper oluşturun
    • times değeri 3 olarak ayarlanmış bir Repeater oluş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
}
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