Untuk menjawab bagian "mengapa" dari pertanyaan tentang mengapa tidak List<T>
, Alasannya adalah bukti masa depan dan kesederhanaan API.
Pemeriksaan masa depan
List<T>
tidak dirancang agar mudah diperluas dengan mensubklasifikasikannya; itu dirancang agar cepat untuk implementasi internal. Anda akan melihat metode di atasnya tidak virtual dan jadi tidak bisa diganti, dan tidak ada kait ke Add
/ Insert
/ Remove
operasi.
Ini berarti bahwa jika Anda perlu mengubah perilaku koleksi di masa mendatang (misalnya untuk menolak objek nol yang orang coba tambahkan, atau untuk melakukan pekerjaan tambahan ketika ini terjadi seperti memperbarui status kelas Anda) maka Anda perlu mengubah jenisnya koleksi yang Anda kembalikan ke subclass yang Anda bisa, yang akan menjadi perubahan antarmuka yang melanggar (tentu saja mengubah semantik hal-hal seperti tidak mengizinkan nol juga bisa menjadi perubahan antarmuka, tetapi hal-hal seperti memperbarui keadaan kelas internal Anda tidak akan menjadi).
Jadi dengan mengembalikan salah satu kelas yang dapat dengan mudah disubklasifikasikan seperti Collection<T>
atau antarmuka seperti IList<T>
, ICollection<T>
atau IEnumerable<T>
Anda dapat mengubah implementasi internal Anda menjadi jenis koleksi yang berbeda untuk memenuhi kebutuhan Anda, tanpa melanggar kode konsumen karena masih dapat dikembalikan sebagai tipe yang mereka harapkan.
Kesederhanaan API
List<T>
mengandung banyak operasi yang bermanfaat seperti BinarySearch
, Sort
dan sebagainya. Namun jika ini adalah koleksi yang Anda paparkan maka kemungkinan Anda mengendalikan semantik dari daftar, dan bukan konsumen. Jadi, sementara kelas Anda secara internal mungkin memerlukan operasi ini, sangat tidak mungkin bahwa konsumen kelas Anda ingin (atau bahkan harus) memanggil mereka.
Dengan demikian, dengan menawarkan kelas koleksi atau antarmuka yang lebih sederhana, Anda mengurangi jumlah anggota yang dilihat pengguna API Anda, dan membuatnya lebih mudah untuk mereka gunakan.