modul 09
DESCRIPTION
ioTRANSCRIPT
Modul 09 : Pemrograman C# Page 1 of 8
Modul 09 – Kelas & Objek (Lanjutan)
Indikator:
Setelah mempelajari modul 08 ini, mahasiswa dapat:
1. Menjelaskan pengertian base-class dan subclass2. Membuat subclass dari suatu class3. Penggunaan kata kunci base4. Melakukan override terhadap suatu method5. Menggunakan kata kunci abstract
Pengertian dan Perbedaan Base-class dan SubclassPada modul sebelumnya, kita telah mempelajari cara pembuatan suatu class. Dalam C#,
kita dapat membuat suatu kelas baru yang mewarisi sifat-sifat kelas yang ada. Kelas baru yang dibuat tersebut disebut subclass dan kelas yang mewariskan sifat disebut base-class.
Subclass mewarisi data-data dan atribut dari base-class-nya, dan memiliki data-data dan atribut baru yang didefinisikan. Subclass juga dapat dibuat subclass lagi, dan seterusnya.
Sebagai contohnya misalkan kita membuat kelas MakhlukHidup. Dari kelas MakhlukHidup, diturunkan suatu kelas misalnya kelas Binatang dan Tumbuhan. Dari kelas Binatang, dapat diturunkan lagi menjadi kelas Herbivora, Karnivora, dan Omnivora. Secara hirarki, kelas tersebut dapat diilustrasikan sebagai berikut:
Bagan struktur kelas MakhlukHidup
Cara Membuat Kelas Turunan (Subclass)Kerangka umum pembuatan class adalah:class SubClassName:Base-className { //isi kode untuk SubClass}
MakhlukHidup
Binatang Tumbuhan
Herbivora OmnivoraKarnivora
Modul 09 : Pemrograman C# Page 2 of 8
Contoh Membuat Kelas TurunanBuatlah C# class baru, beri nama “TurunanBalok”, yang merupakan turunan dari kelas
Balok.01| public class TurunanBalok: Balok
02| {
03| double berat;
04| public double Berat {
05| set { berat = value;}
06| get { return berat;}
07| }
08| }
Kemudian buatlah kelas baru untuk menguji kelas baru TurunanBalok tersebut.01| public static void Main(string[] args)
02| {
03| TurunanBalok tb = new TurunanBalok();
04| tb.Berat = 5;
05| tb.CetakVolume();
06| Console.WriteLine("Berat = {0}",tb.Berat);
07| }
Tampilannya adalahVolume = 6Berat = 5
Pertanyaannya adalah: mengapa volume balok bernilai 6 ???
Penggunaan Kata Kunci basePenggunaan kata kunci base mengacu kepada kelas base-class. Jadi kita tidak perlu
menghapal nama kelas base dari kelas yang sedang dibuat. Penggunaan base biasanya dipakai untuk mengacu kepada constructor dari base-class maupun mengacu kepada base-class untuk memanggil method dari base-class. Sebagai contohnya perhatikan modifikasi kelas TurunanBalok berikut ini.
Sebelumnya, tambahkan terlebih dahulu method void cetakUkuran() ke kelas Balok.public void CetakUkuran() {
Console.WriteLine("panjang = {0}", Panjang); Console.WriteLine("lebar = {0}", Lebar); Console.WriteLine("tinggi = {0}", Tinggi); }
Lalu, ubahlah kelas TurunanBalok menjadi seperti berikut:01| public class TurunanBalok: Balok
02| {
03| double berat;
04| public double Berat {
05| set { berat = value;}
06| get { return berat;}
Modul 09 : Pemrograman C# Page 3 of 8
07| }
08|
09| public TurunanBalok(): base()
10| {
11| berat = 1;
12| }
13| public TurunanBalok(double p, double l, double t): base(p,l,t)
14| {
15| berat = 1;
16| }
17| public TurunanBalok(double p, double l, double t, double b):base(p,l,t)
18| {
19| berat = b;
20| }
21| public new void CetakUkuran()
22| {
23| base.CetakUkuran();
24| Console.WriteLine("Berat = {0}",Berat);
25| }
26| }
Untuk mencoba kelas TurunanBalok tersebut, kita akan coba membuat program utamanya sebagai berikut.
01| public static void Main(string[] args)
02| {
03| TurunanBalok tb = new TurunanBalok(1,2,5,6);
04| tb.CetakVolume();
05| tb.CetakUkuran();
06|
07| Console.Write("Press any key to continue . . . ");
08| Console.ReadKey(true);
09| }
Tampilannya adalahVolume = 10Panjang = 1Lebar = 2Tinggi = 5Berat = 6Press any key to continue . . .
Modul 09 : Pemrograman C# Page 4 of 8
Melakukan Override Terhadap suatu MethodSaat membuat kelas turunan, maka objek dari kelas turunan akan mewarisi data dan
method dari kelas base. Apabila dalam kelas turunan kita membuat method yang bernama yang sama dengan method kelas base, maka kedua method tersebut mungkin saja bersifat “dapat diakses (public)”. Oleh karena itu, maka C# akan “menyembunyikan (hiding)” semua nama method yang sama di dalam base class. Agar compiler tidak memberikan peringatan, maka kata kunci new ditambahkan di method CetakUkuran yang berada di kelas TurunanBalok.
Selain dengan menambahkan kata kunci new, kita juga dapat membuat method yang bernama yang sama dengan method di base class dengan cara “menimpa (override)” method yang ada di base class.
Kegunaan dari mengoverride suatu method adalah kadang-kadang kita merasa method yang diwarisi dari kelas base tidak cocok dengan kelas turunan yang dibuat, sehingga harus menyesuaikan method dengan kelas turunan baru.
Method yang dapat dioverride adalah method yang bersifat virtual. Jadi, pada kelas Balok, tambahkan kata kunci virtual pada method CetakUkuran() seperti berikut.
virtual public void CetakUkuran() { Console.WriteLine("Panjang = {0}",Panjang); Console.WriteLine("Lebar = {0}",Lebar); Console.WriteLine("Tinggi = {0}",Tinggi);}
Kemudian untuk mengoverride method tersebut, pada kelas TurunanBalok, tambahkan kata kunci override pada method CetakUkuran() seperti berikut.
override public void CetakUkuran(){ base.CetakUkuran(); Console.WriteLine("Berat = {0}",Berat);}
Kelas AbstrakKadang kala dalam sebuah kelas, kita hendak membuat method yang implementasinya
bergantung kepada kelas turunan. Dengan demikian, method yang demikian tidak memerlukan implementasi sama sekali. Method demikian dinamakan method abstract.
Apabila di dalam suatu kelas terdapat method abstract, maka kelas tersebut merupakan kelas abstract pula, dan harus ditambahkan kata kunci abstract di depan deklarasi kelas tersebut. Method abstrak harus bertingkat akses public atau protected, tidak boleh bertingkat akses private. Hal ini dikarenakan method abstrak harus diimplementasikan oleh kelas turunan sehingga jika bertingkat akses private, kelas tersebut tidak dapat diakses oleh kelas turunan.
Kelas abstract tidak dapat diinstansiasi (tidak dapat dibuat objek). Cara menggunakan kelas abstrak adalah dengan mendeklarasikan sebuah variabel bertipe kelas abstrak, kemudian variabel tersebut merujuk ke kelas turunan dari kelas abstrak tersebut. Untuk lebih jelasnya, perhatikanlah contoh pembuatan kelas abstrak dan turunannya, dan contoh pemakaiannya berikut ini.
Modul 09 : Pemrograman C# Page 5 of 8
01| abstract public class Bangun2D
02| {
03| public string namaBangun;
04| int banyakSegi;
05|
06| //method abstrak yang tidak mempunyai implementasi
07| //method abstrak harus bersifat public
08| abstract public double Luas();
09| abstract public void CetakUkuran();
10|
11| //method non-abstrak
12| public void SetBanyakSegi(int n) {
13| banyakSegi = n;
14| }
15| }
Kelas turunannya:01| public class PersegiPanjang: Bangun2D
02| {
03| double p, l;
04|
05| //implementasi method abstrak Luas() dan CetakUkuran()
06| //untuk mengimplementasi, perlu ditambahkan kunci "override"
07| override public double Luas() {
08| return p * l;
09| }
10| override public void CetakUkuran() {
11| Console.WriteLine("Panjang = {0}",p);
12| Console.WriteLine("Lebar = {0}",l);
13| }
14| //constructor
15| public PersegiPanjang()
16| {
17| P = 1; L = 1;
18| namaBangun = "Persegi Panjang";
19| SetBanyakSegi(4);
20| }
21| public PersegiPanjang(double p, double l)
22| {
23| P = p;
24| L = l;
25| namaBangun = "Persegi Panjang";
26| SetBanyakSegi(4);
27| }
Modul 09 : Pemrograman C# Page 6 of 8
28| public double P {
29| set {p = value;}
30| get {return p;}
31| }
32| public double L {
33| set {l = value;}
34| get {return l;}
35| }
36| }
Kelas turunannya yang lainnya:01| public class Lingkaran: Bangun2D
02| {
03| double r;
04| public double R
05| {
06| set {r = value;}
07| get {return r;}
08| }
09| //implementasi method abstrak
10| public override void CetakUkuran()
11| {
12| Console.WriteLine("jari-jari = {0}",r);
13| }
14| public override double Luas()
15| {
16| return Math.PI * Math.Pow(r,2);
17| }
18| //constructor
19| public Lingkaran()
20| {
21| R = 1;
22| namaBangun = "Lingkaran";
23| SetBanyakSegi(0);
24| }
25| public Lingkaran(double r)
26| {
27| R = r;
28| namaBangun = "Lingkaran";
29| SetBanyakSegi(0);
30| }
31| }
Modul 09 : Pemrograman C# Page 7 of 8
Contoh Pemakaiannya:01| public static void Main(string[] args)
02| {
03| //mendeklarasikan
04| Bangun2D bangun;
05|
06| //menciptakan objek turunan
07| PersegiPanjang pp = new PersegiPanjang(2,5);
08| Lingkaran lingk = new Lingkaran(10);
09|
10| //bangun dirujuk ke pp
11| bangun = pp;
12| Console.WriteLine("Nama Bangun : {0}",bangun.namaBangun);
13| bangun.CetakUkuran();
14| Console.WriteLine("Luas = {0}",bangun.Luas());
15| Console.WriteLine();
16|
17| //bangun dirujuk ke lingk
18| bangun = lingk;
19| Console.WriteLine("Nama Bangun : {0}",bangun.namaBangun);
20| bangun.CetakUkuran();
21| Console.WriteLine("Luas = {0}",bangun.Luas());
22|
23| Console.Write("Press any key to continue . . . ");
24| Console.ReadKey(true);
25| }
Tampilannya adalah:Nama Bangun : Persegi PanjangPanjang = 2Lebar = 5Luas = 10
Nama Bangun : Lingkaranjari-jari = 10Luas = 314.159265358979Press any key to continue . . .
Pada program di atas, kita membuat kelas Bangun2D yang merupakan kelas abstrak dan mempunyai 2 method abstrak, yaitu (1) double Luas() dan (2) void CetakUkuran(). Kemudian dibuat kelas turunan dari Bangun2D, yaitu (1) kelas PersegiPanjang dan (2) kelas Lingkaran.
Oleh karena Bangun2D mempunyai 2 method abstrak, maka kedua method abstrak tersebut harus diimplementasikan dalam kelas PersegiPanjang maupun kelas Lingkaran. Dalam kelas turunan, kita bebas memberikan data baru maupun method baru. Namun harus diingat bahwa kelas turunan mewarisi data dan method dari kelas base.
Modul 09 : Pemrograman C# Page 8 of 8
Perhatikan bahwa method Luas() dan CetakUkuran() sangat bergantung kepada kelas turunan. Dalam kelas PersegiPanjang, implementasi method tersebut berbeda dengan implementasi pada kelas Lingkaran.
Pada program PemakaianKelasBangun2D, pertama-tama dideklarasikan suatu variabel bangun yang bertipe Bangun2D. Ingat bahwa kita tidak dapat membuat objek bangun, karena kelas Bangun2D merupakan kelas abstrak.
Kemudian kita membuat 2 objek, yaitu objek pp bertipe PersegiPanjang, dan objek lingk bertipe Lingkaran. Saat pembuatan objek, kita mendefinisikan bahwa pp berukuran 2x5, sedangkan lingk mempunyai jari-jari 10.
Perhatikan bahwa bangun dapat dirujuk ke objek pp maupun lingk (baris ke 11 dan 18). Saat dirujuk ke objek berbeda, maka bangun mempunyai perilaku sesuai dengan objek yang dirujuknya (baris ke-12 s/d 14 sama dengan baris ke-19 s/d 21, namun memberikan hasil output yang berbeda).