Menu
CoddyTech

Generics (class dan method)

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 42 dari 70.

Generics memungkinkan kamu menulis class dan method yang bekerja dengan tipe data apa pun sambil tetap menjaga keamanan tipe. Alih-alih menulis class terpisah untuk IntList, StringList, dan DoubleList, kamu menulis satu class generik yang menangani semuanya.

class generik menggunakan parameter tipe, biasanya bernama T, yang diapit tanda kurung sudut:

public class Box<T>
{
    private T content;
    
    public void Store(T item) => content = item;
    public T Retrieve() => content;
}

// Penggunaan dengan tipe data yang berbeda
Box<int> intBox = new Box<int>();
intBox.Store(42);

Box<string> stringBox = new Box<string>();
stringBox.Store("Hello");

Saat kamu membuat Box<int>, compiler mengganti setiap T dengan int. Ini menyediakan pemeriksaan tipe saat kompilasi, sehingga kamu tidak bisa tanpa sengaja menyimpan string di dalam box int.

method generik bekerja dengan cara serupa, sehingga satu method dapat beroperasi pada berbagai tipe:

public static void Swap<T>(ref T a, ref T b)
{
    T temp = a;
    a = b;
    b = temp;
}

int x = 1, y = 2;
Swap(ref x, ref y);  // x=2, y=1

Kompilator menyimpulkan tipe dari argumen, jadi kamu tidak perlu menulis Swap<int> secara eksplisit. Generik adalah dasar dari koleksi seperti List<T> dan Dictionary<TKey, TValue>, yang memungkinkan kode yang dapat digunakan kembali dan aman dari segi tipe.

challenge icon

Tantangan

Mudah

Mari kita buat sistem Storage<T> generik yang dapat menampung dan mengelola item dengan tipe apa pun. Kamu akan membuat class wadah yang dapat digunakan kembali untuk menunjukkan keunggulan generics. Tulis sekali, gunakan dengan integer, string, atau tipe lainnya!

Kamu akan mengatur kodemu dalam dua file:

  • Storage.cs: Buat class Storage<T> generik dalam namespace DataStorage. Wadah penyimpananmu harus:
    • Memiliki array privat bertipe T untuk menampung item, dan property Count yang melacak jumlah item yang tersimpan
    • Menerima kapasitas dalam constructornya untuk menginisialisasi array internal
    • Memiliki method Add(T item) yang menambahkan item jika masih ada ruang
    • Memiliki method Get(int index) yang mengembalikan item pada indeks yang ditentukan
    • Memiliki method GetAll() yang mengembalikan semua item tersimpan yang digabungkan dengan ", "
  • Program.cs: Dalam file utamamu, tunjukkan class generikmu bekerja dengan dua tipe berbeda. Buat Storage<int> dan Storage<string>, tambahkan item ke masing-masing, lalu tunjukkan bahwa class yang sama bekerja dengan lancar pada kedua tipe.

Kamu akan menerima empat input:

  • Integer pertama yang akan disimpan
  • Integer kedua yang akan disimpan
  • String pertama yang akan disimpan
  • String kedua yang akan disimpan

Buat penyimpanan integer dengan kapasitas 5 dan penyimpanan string dengan kapasitas 5. Tambahkan kedua integer ke penyimpanan integer dan kedua string ke penyimpanan string.

Cetak output dengan format ini:

Int storage: {GetAll()}
Int count: {Count}
First int: {Get(0)}
String storage: {GetAll()}
String count: {Count}
First string: {Get(0)}

Misalnya, jika inputnya adalah 42, 100, Hello, dan World, outputnya akan seperti ini:

Int storage: 42, 100
Int count: 2
First int: 42
String storage: Hello, World
String count: 2
First string: Hello

Perhatikan bahwa kamu menulis class Storage<T> sekali, tetapi class tersebut bekerja dengan sempurna untuk int dan string. Itulah keajaiban generics! Compiler memastikan keamanan tipe, sehingga kamu tidak bisa tanpa sengaja menambahkan string ke penyimpanan integermu.

Coba sendiri

using System;
using DataStorage;

class Program
{
    public static void Main(string[] args)
    {
        // Baca input
        int num1 = Convert.ToInt32(Console.ReadLine());
        int num2 = Convert.ToInt32(Console.ReadLine());
        string str1 = Console.ReadLine();
        string str2 = Console.ReadLine();

        // TODO: Buat Storage<int> dengan kapasitas 5
        
        // TODO: Tambahkan kedua bilangan bulat ke penyimpanan bilangan bulat
        
        // TODO: Buat Storage<string> dengan kapasitas 5
        
        // TODO: Tambahkan kedua string ke penyimpanan string
        
        // TODO: Cetak output dalam format yang diminta
        // Int storage: {GetAll()}
        // Jumlah int: {Count}
        // int pertama: {Get(0)}
        // String storage: {GetAll()}
        // String count: {Count}
        // First string: {Get(0)}
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C# online