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.

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

Genel (generic) bir sınıf, bir örnek oluşturulurken sağlanacak olan gerçek tür için bir 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 tip değişkeni olarak işlev görür - Box<String> oluşturduğunuzda, sınıftaki her T, String haline gelir. Bu, her tip için ayrı sınıflar yazmadan size tip güvenliği sağlar.

Sınıfınızın birden fazla tiple çalışması gerektiğinde birden çok tip 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
}

Generic 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 bilgisini kaybetmek yerine, generic'ler derleyicinin hala doğrulayabileceği esnek kodlar yazmanıza olanak tanır.

challenge icon

Görev

Kolay

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

Kodunuzu iki dosya halinde düzenleyeceksiniz:

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

Aynı Wrapper sınıfının dizeler (strings), tam sayılar (integers) ve ondalıklı sayılarla (doubles) nasıl sorunsuz çalıştığına dikkat edin. GiftBox sınıfı, farklı türleri bir araya getirmek için iki tür parametresinin kullanımını gösterir - kart mesajı bir dize olarak kalırken hediye herhangi bir türde olabilir.

Beklenen çıktı:

Wrapped: Chocolate
Wrapped: 42
Wrapped: 3.14

Gift: Teddy Bear
Card: Happy Birthday!

Gift: 100
Card: Congratulations!

Kopya kağıdı

Genel sınıflar, örnekler oluşturulurken belirtilen gerçek türler için yer tutucu olarak tür parametrelerini (T gibi) 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
}

Box<String> oluşturduğunuzda, sınıftaki her T, String haline gelir ve her tür için ayrı sınıflar gerekmeden tür güvenliği sağlar.

Birden fazla türle çalışırken birden fazla tür parametresi kullanın:

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
}

Kendin dene

import 'wrapper.dart';

void main() {
  // TODO: 'Chocolate' içeren bir Wrapper<String> oluşturun ve describe() metodunu çağırın
  
  // TODO: 42 içeren bir Wrapper<int> oluşturun ve describe() metodunu çağırın
  
  // TODO: 3.14 içeren bir Wrapper<double> oluşturun ve describe() metodunu çağırın
  
  // TODO: Boş bir satır yazdırın
  
  // TODO: Hediyesi 'Teddy Bear' ve kartı 'Happy Birthday!' olan 
  // bir GiftBox<String, String> oluşturun, ardından open() metodunu çağırın
  
  // TODO: Boş bir satır yazdırın
  
  // TODO: Hediyesi 100 ve kartı 'Congratulations!' olan 
  // bir GiftBox<int, String> oluşturun, ardından open() metodunu çağı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