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=1Kompilator 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.
Tantangan
MudahMari 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 classStorage<T>generik dalam namespaceDataStorage. Wadah penyimpananmu harus:- Memiliki array privat bertipe
Tuntuk menampung item, dan propertyCountyang 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", "
- Memiliki array privat bertipe
Program.cs: Dalam file utamamu, tunjukkan class generikmu bekerja dengan dua tipe berbeda. BuatStorage<int>danStorage<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: HelloPerhatikan 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)}
}
}
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