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=1Compiler 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.
Tantangan
MudahMari 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 classStorage<T>generik dalam namespaceDataStorage. Wadah penyimpananmu harus:- Memiliki array privat bertipe
Tuntuk menyimpan item dan propertyCountyang 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", "
- Memiliki array privat bertipe
Program.cs: Di file utamamu, tunjukkan cara kerja class generikmu dengan dua tipe berbeda. BuatStorage<int>danStorage<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: HelloPerhatikan 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)}
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalNamespace & DirektifPengantar class & objectKata Kunci 'this'Method dan ParameterField vs PropertyKonstruktorInisialisasi objectRingkasan: Kalkulator Sederhana4Pewarisan
Sintaks Dasar Pewarisan (:)Kata Kunci 'base'Kata Kunci Virtual & OverrideClass SealedBase Class 'object'Rangkuman: Hierarki Karyawan7Fitur Lanjutan
Overloading OperatorIndexer (this[])Penimpaan ToString()Extension methodRingkasan: Custom list2Property & Anggota Statis
Property yang Diimplementasikan OtomatisProperty Hanya Baca dan Hanya TulisField dan method StatisClass StatisAnggota Berbentuk Ekspresi5Polimorfisme & Antarmuka
Polimorfisme saat kompilasi vs runtimeAntarmuka vs kelas abstrakBeberapa antarmukaAntarmuka eksplisitUpcasting & DowncastingRingkasan, Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi daripada PewarisanGenerics (class dan method)Delegate dan EventAtribut dan ReflectionIDisposable dan Pernyataan usingDasar-Dasar Dependency Injection11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositeLatihan sendiri: Compiler C# online