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. Daripada menulis class terpisah untuk IntList, StringList, dan DoubleList, kamu menulis satu class generik yang menangani semuanya.

Kelas 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 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 memberikan pemeriksaan tipe saat kompilasi, jadi kamu tidak bisa secara tidak sengaja menyimpan string di dalam box int.

method generik bekerja dengan cara yang serupa, memungkinkan satu method 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

Compiler menyimpulkan tipe dari argumen, jadi kamu tidak perlu menulis Swap<int> secara eksplisit. Generics adalah dasar dari koleksi seperti List<T> dan Dictionary<TKey, TValue>, sehingga kode dapat digunakan kembali dan aman dari kesalahan tipe.

challenge icon

Tantangan

Mudah

Mari buat sistem Storage<T> generik yang dapat menyimpan dan mengelola item dengan tipe apa pun. Kamu akan membuat class wadah yang dapat digunakan kembali untuk menunjukkan keunggulan generik: tulis sekali, gunakan dengan bilangan bulat, 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 menyimpan item dan property Count yang melacak jumlah item yang tersimpan
    • Menerima kapasitas di konstruktor 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: Di file utamamu, tunjukkan cara kerja class generikmu dengan dua tipe berbeda. Buat Storage<int> dan Storage<string>, tambahkan item ke masing-masing, dan tunjukkan bahwa class yang sama dapat bekerja dengan lancar untuk kedua tipe tersebut.

Kamu akan menerima empat input:

  • Bilangan bulat pertama yang akan disimpan
  • Bilangan bulat kedua yang akan disimpan
  • String pertama yang akan disimpan
  • String kedua yang akan disimpan

Buat penyimpanan bilangan bulat dengan kapasitas 5 dan penyimpanan string dengan kapasitas 5. Tambahkan kedua bilangan bulat ke penyimpanan bilangan bulat dan kedua string ke penyimpanan string.

Cetak output dengan format berikut:

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 berikut:

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 generik! Compiler memastikan keamanan tipe, sehingga kamu tidak bisa tanpa sengaja menambahkan string ke penyimpanan bilangan bulatmu.

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 dua bilangan bulat ke penyimpanan bilangan bulat
        
        // TODO: Buat Storage<string> dengan kapasitas 5
        
        // TODO: Tambahkan dua 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