Menu
Coddy logo textTech

Generic Sınıflar

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 65 / 110.

List<String> gibi Dart'ın yerleşik koleksiyonlarının tür parametrelerini nasıl kullandığını gördün. Şimdi, belirttiğin herhangi bir türle çalışan kendi genel sınıflarını oluşturma zamanı.

Genel bir sınıf, bir örnek oluşturulurken sağlanacak gerçek tür için yer tutucu olarak bir tür parametresi (genellikle T) kullanır:

class Box<T> {
  T content;
  
  Box(this.content);
  
  T getContent() => content;
}

void main() {
  var stringBox = Box<String>('Hello');
  var intBox = Box<int>(42);
  
  print(stringBox.getContent());  // Hello
  print(intBox.getContent());     // 42
}

T, bir tür değişkeni görevi görür - Box<String> oluşturduğunuzda, sınıftaki her T String olur. Bu, her tür için ayrı sınıflar yazmadan tür güvenliği sağlar.

Birden fazla türle çalışması gerektiğinde sınıfınızda birden çok tür parametresi kullanabilirsiniz:

class Pair<K, V> {
  K first;
  V second;
  
  Pair(this.first, this.second);
}

void main() {
  var pair = Pair<String, int>('age', 25);
  print('${pair.first}: ${pair.second}');  // age: 25
}

Jenerik sınıflar, yeniden kullanılabilir ve tür güvenli kodun temelidir. Farklı türler için mantığı yinelemek veya dynamic ile tür bilgilerini kaybetmek yerine, jenerikler derleyicinin yine de doğrulayabileceği esnek kod yazmanıza olanak tanır.

challenge icon

Görev

Kolay

Farklı öğe türleri için esnek kapsayıcılar oluşturmak üzere jenerik sınıfları kullanan bir hediye paketleme sistemi oluşturalım. Her tür içeriği paketleyebilen jenerik bir Wrapper sınıfı ve bir hediyeyi kart mesajıyla eşleştirmek için iki tür parametresine sahip bir GiftBox sınıfı oluşturacaksınız.

Kodunuzu iki dosyada düzenleyeceksiniz:

  • wrapper.dart: Jenerik sınıflarınızı burada tanımlayın:
    • Wrapper<T> özelliğine ve bir kurucuya sahip jenerik bir T content sınıfı. İçeriği döndüren unwrap() yöntemini ve describe() yazdıran Wrapped: [content] yöntemini ekleyin
    • İki özelliğe sahip jenerik bir GiftBox<G, C> sınıfı: G gift ve C card. Bir kurucu ve bir satırda open(), sonraki satırda Gift: [gift] yazdıran Card: [card] yöntemini ekleyin
  • main.dart: Wrapper dosyanızı içe aktarın ve jenerik sınıfları farklı türlerle gösterin:
    • Wrapper<String> içeren bir 'Chocolate' oluşturun ve describe() yöntemini çağırın
    • Wrapper<int> içeren bir 42 oluşturun ve describe() yöntemini çağırın
    • Wrapper<double> içeren bir 3.14 oluşturun ve describe() yöntemini çağırın
    • Boş bir satır yazdırın
    • GiftBox<String, String> hediyesi ve 'Teddy Bear' kartıyla bir 'Happy Birthday!' oluşturun, ardından open() yöntemini çağırın
    • Boş bir satır yazdırın
    • Hediyesi GiftBox<int, String> (hediye kartı tutarını temsil eder) ve kartı 100 olan bir 'Congratulations!' oluşturun, ardından open() yöntemini çağırın

Aynı Wrapper sınıfının dizeler, tam sayılar ve double değerleriyle nasıl sorunsuz çalıştığına dikkat edin. GiftBox sınıfı, farklı türleri eşleştirmek için iki tür parametresinin kullanımını gösterir; hediye herhangi bir türde olabilirken kart mesajı bir dize olarak kalır.

Beklenen çıktı:

Wrapped: Chocolate
Wrapped: 42
Wrapped: 3.14

Gift: Teddy Bear
Card: Happy Birthday!

Gift: 100
Card: Congratulations!

Kendin dene

import 'wrapper.dart';

void main() {
  // TODO: 'Chocolate' içeren bir Wrapper<String> oluştur ve describe() çağır
  
  // TODO: 42 içeren bir Wrapper<int> oluştur ve describe() çağır
  
  // TODO: 3.14 içeren bir Wrapper<double> oluştur ve describe() çağır
  
  // TODO: Boş bir satır yazdır
  
  // TODO: Create a GiftBox<String, String> with gift 'Teddy Bear' 
  // and card 'Happy Birthday!', then call open()
  
  // TODO: Boş bir satır yazdır
  
  // TODO: hediye 100 ile bir GiftBox<int, String> oluştur 
  // and card 'Congratulations!', then call open()
}
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

Kendi başına pratik yap: Online Dart derleyicisi