Tambahan
Mengecek tipe Suatu Objek dan Casting
Ada kemungkinan kita menggunakan suatu instance dari tipe turunan seperti Persegi, tetapi kita hanya tahu bahwa ia adalah Poligon. Terkadang kita ingin untuk mencari tahu tipe apa sebenarnya suatu objek, dan menanganinya secara berbeda berdasarkan tipe nya.
Kita dapat mengecek bahwa suatu objek adalah suatu tipe tertentu, dengan keyword is dan casting:
Poligon poligon = new Persegi(4.5f);
if (poligon is Persegi)
{
// Variabel poligon di cast menjadi 'Persegi'
// Lalu disimpan ke variabel persegi
Persegi persegi = (Persegi)poligon;
// Sekarang kita dapat melakukan apapun dengan
// persegi ini
}Keyword 'as'
Sebagai tambahan dari casting, ada cara lain untuk kita mengonversi dari suatu tipe objek ke tipe lainnya. Ini dilakukan menggunakan keyword as, yang terlihat seperti ini:
Poligon poligon = new Persegi(4);
// Mirip seperti (Persegi)poligon
Persegi persegi = poligon as Persegi;Ada beberapa perbedaan antara menggunakan keyword as dan casting, dan sebenarnya, menggunakan keyword as pada situasi ini adalah pilihan yang lebih baik.
Untuk dapat memahami ini, mari berasumsi bahwa selain class Poligon dan Persegi yang sudah kita lihat, ada class lain, yaitu Segitiga. Misalkan kita punya variabel dengan tipe Poligon, dan mengisinya dengan objek Segitiga baru, lalu kita tidak sengaja mengubahnya menjadi Persegi:
Poligon poligon = new Segitiga();
Persegi persegi = (Persegi)poligon;Pada kasus seperti ini, program akan crash, dan memberi kita error yang mengatakan bahwa ada invalid cast. Di sisi lain, jika kita menggunakan keyword as, bukannya crash, kita akan mendapatkan null, yang dapat kita respon dengan:
Poligon poligon = new Segitiga();
Persegi persegi = poligon as Persegi;
if (persegi != null)
{
// ...
}Menggunakan Inheritance di Array
Layak untuk disebutkan juga bahwa kita dapat membuat sebuah array dari suatu base class, dan memasukkan semua derived class di dalamnya. Ini sama saja seperti yang sudah kita lihat dengan variabel yang tidak array, jadi seharusnya tidak terlalu mengejutkan:
Poligon[] banyakPoligon = new Poligon[5];
banyakPoligon[2] = new Persegi(2.1f);
banyakPoligon[3] = new Segitiga();Constructor dan Inheritance
Sebelumnya sudah disebutkan bahwa dalam derived class, semua property, instance variable, dan method akan diwariskan. Constructor di sisi lain, tidak diwariskan.
Kita tidak dapat menggunakan constructor yang ada di base class untuk membuat sebuah derived class. Contohnya, pada class Poligon kita ada constructor yang mengambil nilai int yang digunakan untuk jumlah sudut poligon. Kita tidak dapat membuat sebuah Persegi dengan constructor tersebut. Dan untuk alsan yang baik. Ingat, constructor adalah method spesial yang didesain untuk menuliskan bagaimana kita membuat instansce baru dari sebuah tipe. Dengan inheritance, sebuah constructor di dalam base class tidak tahu bagaimana cara untuk menyiapkan bagian dari derived class. untuk membuat instance dari suatu class, kita harus menggunakan salah satu constructor yang ada dalam class tersebut.
Ketika suatu derived class mendefinisikan sebuah constructor, ia perlu untuk memanggil salah satu constructor di base class. Secara default, sebuah constructor di derived class akan menggunakan constructor tanpa parameter dari base class. (Ingat, jika kita tidak ingin mendefinisikan constructor sendiri, sebuah constructor default tanpa parameter akan dibuatkan.) Jika base class tidak memiliki constructor tanpa parameter, atau jika ingin constructor yang di derived class menggunakan yang berbeda, kita perlu mengindikasikan constructor mana yang akan digunakan. Ini dapat dilakukan dengan menggunakan titik dua (':') dan keyword base diikuti dengan parameter dari constructor yang kita ingin pakai, seperti ini:
public Persegi(float sisi) : base(4) // Gunakan constructor
{ // Poligon(int jumlahSudut)
Sisi = sisi;
}Access Modifier 'protected'
Kita sudah pernah membahas perbedaan private dan public. Untuk mengingat, public berarti semua orang dapat mengakses member (variabel, method, properti, dll), sedangkan private berarti hanya diri sendiri yang dapat mengaksesnya.
Dengan inheritance kita memiliki opsi lain: protected. Jika suatu member dari class menggunakan level accessibility protected, semua yang ada di dalam class dapat menggunakannya, dan juga semua derived class. Jadi lebih luas dari pada private tetapi lebih restriktif dari public.
Jika class Poligon membuat properti JumlahSudut menjadi protected dan bukan public, kita hanya dapat mengaksesnya di mana saja di class Poligon, dan juga Persegi, dan semua derived class dari Poligon, tetapi tidak diluar itu.
Base Class dari Semuanya: object
Tanpa menspesifikasikan class untuk diturunkan, semua class yang kita buat masih diturunkan dari suatu base class khusus yaitu base class dari segalanya. Ini adalah class object. Semua class diturunkan dari ini secara default, kecuali jika kita menyebutkan class lain. Tetapi bahkan jika menyebutkan class lain sebagai base class, class tersebut masih diturunkan dari objek class. Jika kalian pergi ke atas hirarki inheritance, semuanya akan kembali ke objek cepat atau lambat.
Kalian dapat menggunakan tipe ini di kode dengan menggunakan keyword object (yang mana merupakan alias dari System.Object). Ingat bahwa kita dapat menyimpan derived class ke base type seperti berikut?
Poligon poligon = new Persegi(4.5f);Kita juga dapat memasukkannya ke tipe object:
object objekApapun = new Persegi(4.5f);Karena tipe object adalah base class dari segalanya, semua dan setiap tipe objek dapat disimpan didalamnya.
Sealed Classes
Seal: segel
Ada waktunya ketika kalian ingin mencegah suatu class untuk diturunkan. Ini mungkin terjadi jika kita ingin memastikan bahwa tidak ada satu pun yang diturunkan dari suatu class spesifik.
Kita dapat menggunakan keyword sealed agar tidak ada yang dapat mewarisi suatu class tertentu dengan menambahkannya dalam definisi class:
sealed class Persegi : Poligon
{
// ...
}'Menyegel' sebuah class juga dapat meningkatkan kinerja.
Partial Classes
Sebuah class dapat dipisah menjadi beberapa file atau bagian menggunakan keyword partial:
public partial class SuatuClass
{
public void LakukanSesuatu()
{
}
}
public partial class SuatuClass
{
public void LakukanSesuatuYangLain()
{
}
}Jika dua bagian ini ada dalam file terpisah, mereka akan digabungkan jika di compile.
Walaupun kita dapat menggunakan partial class untuk memisah class yang besar menjadi beberapa file yang lebih dapat diatur, ini bukanlah tujuan dari partial class. Dalam kasus seperti itu akan lebih tepat jika mencari cara untuk memisah menjadi beberapa class.
Tujuan sebenarnya dari partial class adalah untuk memisah antara batas "kepemilikan". Contohnya, pada framework UI, biasanya memiliki suatu alat design GUI, dimana kalian bisa drag and drop tombol, checkbox, dll. Ke suatu kanvas yang dapat diedit. Alat design nya mungkin menangani satu bagian, dan bagian yang lain yang akan dikerjakan programmer.
C# Tidak Mendukung Inheritance Ganda (Multiple Inheritance)
Beberapa bahasa pemrograman berorientasi objek (C++ contohnya) memperbolehkan untuk memilih lebih dari satu base class untuk diturunkan. Ada keuntungannya tentunya, karena ini memungkinkan untuk suatu tipe dari objek memiliki hubungan is-a dengan dari satu tipe lain. Contohnya mungkin kita punya class PisauSaku yang merupakan Pisau dan sekaligus Gergaji yang sangat buruk.
Sayangnya, memiliki inheritance ganda merumitkan segalanya, yang mengakibatkan situasi dimana akan ambigu bagaimana suatu class harus bekerja. Karena ini, C# tidak memperbolehkan multiple inheritance. Kita harus memilih satu saja sebagai base class.
Kita sebenarnya juga dapat meniru multiple inheritance menggunakan interface.
Last updated