Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
CHAPTER #4
Object Oriented Programming
(Class, Inheritance, Encapsulation dan Interface)
C# adalah sebuah bahasa pemrograman yang object-oriented. Dengan menggunakan bahasa pemrograman yang object-oriented , dapat dibuat sebuah program dengan code yang berkualitas, mudah di-maintain dan code yang dapat di-reuse (dipakai di bagian lain dari program tanpa perlu anda menulis ulang baris-baris code tersebut). Menulis program yang object-oriented sangat berbeda dengan menulis program yang bersifat procedural. Untuk dapat menulis program yang object-oriented, harus dipahami terlebih dahulu fitur-fitur object-oriented yang ada pada bahasa C#. Namun, untuk sampai ke sana, terlebih dahulu harus dipahami prinsip-prinsip dasar dari permrograman object-oriented seperti misalnya: Abstraction, Encapsulation, Inheritance dan Polymorphisme.
4.1.Object dan Class 4.1.1.Object Secara mudah, sebuah object dapat dipahami sebagai sebuah benda. Benda apa saja yang dapat dikenali atau dibayangkan. Nyata maupun abstrak. Fisik maupun konseptual. Termasuk juga software. Contoh benda fisik adalah mobil, truk, rumah, buku, dokumen, harddisk, printer, keyboard dan lain-lain. Contoh benda konseptual misalnya sebuah proses. Tetapi, definisi object tidak berhenti disitu saja. Bagi programmer, object adalah sebuah benda yang dapat dinyatakan (represent) dalam sebuah program. Seorang customer adalah sebuah object yang dapat anda nyatakan dalam program. Demikian juga produk, perusahaan, hingga benda-benda seperti database, file, dan lain-lain. Dengan kondisi ini maka dimungkinkan ditulisnya code yang memodelkan dunia nyata ke dalam program, dan juga dimungkinkan untuk memecah program menjadi unitunit kecil yang tentunya lebih mudah di bangun dan di-manage. Dan tentu saja, memungkinkan adanya code reuse.
4.1.1.1.Definisi Formal Secara formal, object dapat didefinisikan sebagai sebuah benda (entity) yang memiliki batasan (boundary) dan identitas (identity) yang terdefinisi dengan jelas, yang membungkus (encapsulate) kondisi (state) dan perilaku (behavior). Berdasarkan definisi diatas, kita dapat menyatakan bahwa : • Sebuah object adalah sebuah benda yang memiliki batasan yang terdefinisi dengan jelas. Maksudnya, tujuan dari object tersebut harus jelas. • Sebuah object memiliki dua hal: kondisi (state) dan perilaku (behavior). • Kondisi (state) dari suatu object sering dinyatakan melalui attribute dari object tersebut. Sedangkan perilaku (behavior) dinyatakan melalui operations dari object tersebut.
4.1.1.2.State atau Attribute dan Behaviour State dapat dipahami sebagai suatu karakteristik yang menjelaskan keadaan atau kondisi suatu object. State dinyatakan dalam bentuk attribute atau property yang memiliki nilai atau isinya sendiri-sendiri. Sebagai contoh dalam kehidupan nyata : • Mobil memiliki warna, misalnya berwarna pink. • Mobil memiliki kapasitas mesin, misalnya 1800 cc. • Monitor komputer memiliki merek tertentu, misalnya saja samsung. • Seorang mahasiswa memiliki NIM, nama, alamat. Semuanya merupakan attribute dari setiap mahasiswa.
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
1
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
•
Sebuah file pada komputer memiliki ukuran tertentu, misalnya 37 MegaByte. State dari satu object bukan dilihat dari satu attribute saja, melainkan didefinisikan oleh total dari seluruh attribute yang dimiliki object tersebut. Behavior adalah perilaku, bagaimana sebuah object ber-aksi dan ber-reaksi. Sebuah object akan melakukan aksi atau reaksi terhadap request atau permintaan dari object lain. Misalnya, dapat dilakukan beberapa aksi pada sebuah object pintu, yaitu : dapat dibuka, dapat dikunci, dll. Behavior dinyatakan dalam bentuk method pemrograman object-oriented. Sebagai contoh : • Mobil dapat dijalankan ke depan maupun ke belakang. • Mesin mobil dapat diperbaiki jika rusak. • Monitor komputer dapat dihidupkan atau dimatikan dengan menekan tombol power pada monitor. • Seorang mahasiswa dapat mengambil suatu mata kuliah terntentu. • Sebuah file pada komputer dapat diganti namanya, dipindahkan atau dihapus. State dan behaviour yang merupakan karakteristik dari object di dalam dunia nyata juga menjadi bagian dari object yang direalisasikan pada sebuah program.
4.1.2.Class Sebuah class adalah sebuah deskripsi dari sekumpulan object yang memiliki attribute, operasi dan hubungan antar object yang sama. Sebuah object dinyatakan sebagai sebuah instance dari sebuah class. Sebuah class adalah blueprint atau rancangan dari sebuah object. Class merupakan prototipe yang mendefinisikan state dan behaviour dari suatu object secara umum. Pada sisi lain, object merupakan instance atau bentuk nyata dari suatu class. Sebagai contoh, mobil dapat didefinisikan sebagai suatu benda yang memiliki attribute atau property tertentu, memiliki roda, memiliki mesin, memiliki pintu, memiliki tempat duduk dll. Mobil juga memiliki tingkah laku tertentu (behavior), dapat dijalankan ke depan dan ke belakang, mesin mobil dapat dihidupkan atau dimatikan, lampu mobil dapat diganti, pintu mobil dapat ditutup dan dikunci, mesin dapat diperbaiki atau diganti spare part-nya jika rusak dll. Definisi ini dapat disamakan dengan class, mobil adalah sebuah class. Bentuk nyata atau instance dari mobil misalnya adalah mobil kijang, mobil honda jazz dll. Dengan menggunakan konsep mobil secara umum, dibuat sebuah mobil yang memiliki 18 roda, memiliki mesin berkapasitas 4000 cc, memiliki 2 pintu. Mobil ini juga dapat digunakan untuk mengangkut muatan yang berat dan besar dan tentu saja mobil ini bisa dijalankan ke depan maupun ke belakang sesuai konsep mobil secara umum. Mobil inilah yang disebut sebagai object yang dibuat dari class mobil tadi. Trailer atau tronton adalah sebuah object. Secara grafis, sebagai contoh, sebuah class dosen dapat digambarkan seperti gambar 4.1.
Gambar 4.1. Class Dosen Jadi, sebuah class adalah sebuah definsi abstract dari sebuah object. Class mendefinisikan struktur dan behavior dari setiap object dari class tersebut. Class berfungsi sebegai template untuk membuat object.
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
2
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
4.1.2.1.Attribute dan Operation Attribute atau property adalah kondisi pada suatu object yang membentuk state dari object tersebut. Attribute memiliki nama dan nilai yang spesifik. Setiap attribute juga memiliki type tertentu sehingga nilai di dalam attribute ini harus sesuai dengan type yang dimiliki. Type dalam C# dapat berupa int, string, bool dll. Sebuah class dapat memiliki attribute maupun tidak. Operation adalah implementasi dari sebuah service yang dapat diminta oleh objectobject lain dari class untuk mempengaruhi bahavior-nya. Operation dari sebuah class mendeskripsikan apa yang dapat dilakukan oleh class tersebut. Operation dapat berbentuk perintah (command) ataupun pertanyaan (question). Melalui operation berbentuk perintah ini state ataupun juga nilai dari sebuah attribute dapat diubah. Sebuah operation dideskripsikan dengan sebuah return type, nama operation dan parameter ( 0 atau lebih). Secara keseluruhan return type, nama dan parameter dari sebuah operation disebut sebagai signature dan operation tersebut. Pada pemrograman, operation direalisasikan pada method.
Gambar 4.2. Attribute dan Operation dari Sebuah Class
4.1.2.2.Deklarasi Class Deklarasi sebuah class dapat dilakukan dengan bentuk sbb : [attributes] [class modifier] [class base] Bagian yang menggunakan tanda [] bersifat optional atau tidak wajib digunakan. Ada tiga bagian yang harus ada, class, identifier dan class-body. class adalah keyword. Identifier adalah nama dari class yang akan dibuat. Class-body adalah tempat didefinisikannya attribute dan operation dari object yang dibangun berdasarkan class ini.
4.1.2.3.Contoh Implementasi Class Sebagai contoh akan dibuat sebuah class yang berfungsi untuk melakukan konfersi suhu pada derajat celcius dan fahrenheit. Dapat digambarkan class termometer yang akan dibuat seperti pada gambar 4.3. class termometer - jenis - suhu +ubahJenis +ubahSuhu
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
3
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
+suhuCel +suhuFahr Gambar 4.3. Class Termometer Class termometer terbagai menjadi 3 bagian. Bagian pertama merupakan nama class. Bagian kedua berisi property yang ada. Tanda – menunjukkan bahwa property tersebut berlaku di dalam class saja. Tidak bisa diakses dari luar class atau bersifat private. Bagian ketiga berisi daftar operation yang dimiliki. Tanda + menujukkan bahwa operation tersebut bisa digunakan dari object lain atau bersifat public. Attribute jenis berisi jenis dari termometer, dapat berisi karakter C untuk jenis celsius maupun karakter F untuk jenis fahrenheit. Attribute suhu merupakan attribute yang berisi angka yang merupakan suhu pada termometer ini. Karena kedua attribute ini bersifat private maka harus digunakan method yang bersifat public untuk mengubah isinya, yaitu method ubahJenis dan ubahSuhu. suhuCel dan suhuFahr merupakan method yang digunakan untuk menampilkan suhu termometer dalam derajat celcius maupn fahrenheit. Isi dari kedua method ini merupakan perhitungan perubahan derajat yang digunakan sesuai dengan jenis termometer (C atau F) dan suhu yang diinginkan (C atau F). Jika jenis suhu yang diinginkan berbeda dengan jenis termometer maka akan dilakukan perhitungan dan hasilnya menjadi nilai return, jika sama maka suhu dari termometer yang menjadi nilai return. Kode 4.1 public class termometer { private string jenis; private double suhu; public void ubahJenis(string jenis) { this.jenis = jenis; } public void ubahSuhu(double suhu) { this.suhu = suhu; } public double suhuCel() { if (this.jenis == "C") return this.suhu; else if (this.jenis == "F") return 5*(this.suhu - 32) / 9; else return 0; } public double suhuFahr() { if (this.jenis == "C") return 9*this.suhu/5 +32; else if (this.jenis == "F") return this.suhu; else return 0; } }
Untuk menggunakan class ini perlu dibuat object baru yang dibuat dari class termometer ini. Kode 4.2. class Program { static void Main(string[] args) { termometer termo = new termometer(); termo.ubahJenis("C"); termo.ubahSuhu(37); Console.WriteLine("suhu celcius : "+ termo.suhuCel()); Console.WriteLine("suhu fahrenheit : "+ termo.suhuFahr()); Console.ReadKey(); }
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
4
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
}
Pada program kode 4.2 dibuat sebuah object bernama termo yang merupakan instance dari class termometer (baris 5). Denan demikian object termo ini memiliki setiap attribute dan method yang dimikili oleh class termometer. Pada baris 6 dan 7 dilakukan pemanggilan method ubahJenis dan method ubahSuhu dari object termo ini. Pada baris 7 dan 8 dilakukan pemanggilan method suhuCel dan method suhuFahr dan hasilnya ditampilkan ke layar console dengan method Console.WriteLine.
4.1.2.4.Abstact Class Abstrak class digunakan untuk menunjukkan bahwa suatu class belum selesai, masih abstrak belum kongkrit. Class ini biasanya digunakan sebagai base class. Abstract class tidak bisa di-create menjadi object, tetapi bisa me-refer objek kongkrit yang classnya diturunkan dari dirinya. Abstrak class boleh memiliki abstract member. Kode 4.3. abstract class A { public abstract void F(); } abstract class B:A { public void G() { } } class C:B { public override void F() { //Implementasi sesungguhnya } }
A adalah abstract class dengan abstract member F(). Abstract member tidak ada aktifitas apapun. Class B dturunkan dan class A, tetapi karena B adalah abstract class maka ia tidak perlu mengimplemantasikan F(). Ini tidak berarti B tidak boleh mengimplemenasikan F(). Tetapi jika B mengimplemantasikan F() maka C tidak wajib mengimplementasikan F(). Class B menambah method G(). Karena Class C diturunkan dari B sedang B diturunkan dari A maka C harus mengimplemantasikan F().
4.1.2.5.Sealed Class Sealed class adalah class yang memakai modifier sealed. Class yang di-sealed tidak bisa diturunkan atau tidak bisa menjadi base class dari class yang lain. Kode 4.4 sealed class C:B { public override void F() { Console.WriteLine("FROM C.F()"); } } class D:C { }
Class D tidak bisa di-compile karena C adalah sealed class.
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
5
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
4.1.2.6.Class Member Class member dibagi menjadi beberapa kategori: • Konstanta • Field • Method • Properties • Event • Indexer • Operator • Constructor • Destructor
4.1.2.6.1.Konstanta Konstanta adalah anggota Class yang bernilai tetap. Nilai konstanta diperhitungkan pada saat kompilasi program. Konstanta dideklarasikan sebagai berikut: [attribute] [modifiers] <deklarasi>
Attribute kita tidak akan bahas disini. • Modifiers : new, public, protected, internal, private. public : semua objek boleh akses tanpa batas. private : hanya berlaku dalam Class. protected : hanya boleh diakses Class sendiri dan turunannya. protected : hanya boleh diakses Class-Class dalam satu assembly.
•
Declarasi
:
Identifier = expresi Identifier = expresi , Identifier =expresi
Kode 4.5. class { public const double X=1.0, Y=2.0, Z=3.0; }
Atau bisa ditulis seperti ini : Kode 4.6. class A { public const double X=1.0; public const double Y=2.0; public const double Z=3.0 }
Konstanta diperhitungkan saat kompilasi bukan saat run program, sehingga tidak bisa diberikan nilai yang tidak bisa diperhitungkan saat kompilasi. Konstanta boleh ada ketergantungan dengan konstanta Class lain dalam satu assembly maupun tidak sepanjang ketergantungannya tidak sirkular. Contoh berikut ini adalah legal : Kode 4.7. class A { public const int X=B.Z + 1; public const int Y=10; } class B { public const int Z =A.Y + 1; }
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
6
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
Saat kompilasi pertama-tama dilakukan evaluasi terhadap A.Y, kemudian B.Z baru kemudian A.X. Hasilnya adalah 10, 11, 12. Tidak disarankan untuk melakukan hal ini, prinsip OOP yang sangat penting, information hiding. Misalnya dalam class termometer, nilainya akan dibatasi pada batas tertentu. Diberikan batas antara 0 sampai 100 derajat celsius. Kemudian akan digagalkan inisialisai yang melebihi 100 atau kurang dari 0. Kode 4.8. public class Cels:Termometer { private const private const double _min=0; double _max=100; public Cels(double Temperatur):base(Temperatur) { if(!(Temperatur<=Cels._max && Temperatur>=0)) throw new ApplicationException("Overflow Temperatur."); base._name="Celsius"; } . . . . }
Tidak bisa dilakukan pengambilan nilai konstanta dengan keyword this. Seperti telihat pada contoh diatas, harus dipanggil nama classnya jadi harus Cels._max dan Cels._min. Terkadang jika ingin membuat konstanta dari sebuah class yang mesti diinstan. Hal ini tidak bisa dilakukan, karena konstanta dievaluasi saat kompilasi. Untuk melakukan hal ini kita harus digunakan field.
4.1.2.6.2.Field Field adalah anggota class yang merupakan variable. Field dideklarasikan sebagai berikut: [Attributes] [modifier] <deklarasi>
• •
Modifier: new, public, protected, internal, private, static, readonly, volatile Declarasi : Identifier; Identifier = inisialisasi variabale; Identifier = Inisialisasi variabale, identifier = inisialisasi variable;
Dalam OOP field biasanya hanya dipakai untuk menyimpan data. Sedangkan data ini sifatnya disembunyikan. Untuk mencapai data tersebut gunakan accessor atau method untuk menanganinya. Kelihatannya ini terlalu komplek, tetapi ketika program sudah menjadi besar dan rumit, konsep ini akan sangat banyak membantu. Terkadang jika ingin membuat suatu konstanta dari instance suatu object, tetapi karena konstanta dieksekusi saat kompilasi hal ini tidak dapat dilakukan. Misal, jika ingin sebuah class berisi konstanta warna hitam, putih, merah, hijau, dan biru, tetapi karena warna-warna ini dibuat dari class yang objeknya mesti diinstan, akibatnya tidak bisa dituliskan sebagai: const Color Black=new Color(0,0,0); Oleh karena itu bisa digunakan static field yang readonly. Perbedaan antara static dan instance field adalah berapa kalipun sebuah class di-instan menjadi object, static field akan tetap satu, sedangkan instan field akan sebanyak objek dari class tersebut. Dengan
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
7
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
demikian, dapat dikatakan bahwa static field merupakan milik class dari pada object. Berikut ini adalah contohnya : Kode 4.9. public class Color { public static readonly public static readonly public static readonly public static readonly public static readonly
Color Color Color Color Color
Black = new Color(0,0,0); White = new Color(255,255,255); Red = new Color(255,0,0); Green = new Color(0,255,0); Blue = new Color(0,0,255);
private byte red, green, blue; public Color (byte r, byte g, byte b) { red = r; green = g; blue = b; } }
Berapapun dibuat objek Color, instan dari Black, White, Red, Green dan Blue jumlahnya tetap satu. Karena warna-warna ini bukan milik objek, tidak bisa di-refer dengan cara object.Black tetapi harus di-refer sebagai Color.Black.
4.1.2.6.3.Method Method adalah anggota class yang berisi baris paris perintah perhitungan atau aksi yang bisa dipanggil oleh class atau object. Method dideklarasikan sebagai berikut: [Attribute] [modifier] { . . . . }
• • •
([parameter])
Modifier: new, public, protected, internal, private, static, virtual, sealed, override, abstract, extern. Return-type: type, void. Void digunakan jika method tidak ada nilai kembalian. Parameter Modifier: ref, out, params (array parameter).
4.1.2.6.4.Method Overloading Terkadang diperlukan pembuatan beberapa method dengan nama yang sama tapi dengan parameter yang berbeda-beda. Method ini disebut sebagai method overloading. Dalam C# hal ini diizinkan. Yang harus diperhatikan adalah type bukan nama. Kode 4.10. class MethodOverLoading { public void Test(int a, string s) { //operasi int dan string } public void Test(string a, int s) { //operasi string dan int } public void Test(string s, int a, byte b) { //operasi string, int dan byte } public void Test(byte b, string s) { //operasi byte dan string } }
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
(1) (2) (3) (4)
8
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
Pada penggunaannya, jika ada pemanggilan void Test dengan menggunakan dua parameter bertype int dan string, maka secara otomatis yang digunakan adalah void Test yang (1). Jika parameter yang digunakan adalah parameter dengan type byte dan string maka yang digunakan adalah void Test yang (4).
4.2.Inheritance Inheritance, di dalam OOP dijelaskan sebagai kemampuan sebuah object untuk meng-inherit atau mewarisi data dan functionality dari parent class-nya. Dengan inheritance, dapat dibuat sebuah class baru dari class yang sudah ada daripada membuat sendiri dari awal sebuah class yang benar-benar baru. Parent class yang akan di-inherit oleh class yang baru sering disebut juga sebagai base class, sedangkan class baru tadi disebut dengan derived class.
4.2.1.Base Class Inheritance dapat digambarkan sebagai berikut :
Gambar4.3. Base class dan Derived Class Dalam menulis code untuk derived class, digunakan tanda titik dua “:” sesudah nama class, kemudian diikuti dengan nama dari base class. Kode 4.11. public class Base { // codes } public class Derived: Base { // codes }
Derived class akan meng-inherit segala hal yang dimiliki oleh base class kecuali constructor dan destructor. Seluruh public member dari base class secara implicit juga menjadi public member dari derived class. Sedangkan private member dari base class, meskipun juga di-inherit oleh derived class, hanya dapat diakses oleh base class itu sendiri.
4.2.2.Base Class Member Sekarang kita akan melihat suatu access modifier yaitu protected. Member dari suatu derived class dapat mengakses member protected dari base class-nya seperti halnya mengakses member base class yang public. Untuk lebih jelasnya, perhatikan contoh berikut: Kode 4.12. public class Base
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
9
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
{ protected string nama; } public class Derived: Base { public string Nama() { return nama; } }
Akan tetapi, member protected dari sebuah class tidak dapat diakses oleh class lain yang tidak derive dari base class tadi. Kode 4.13. public class Other { void Try (Base b) { return b.nama } }
Class other tidak men-derive class base, sementara “nama” adalah member protected dari class Base. Code ini tidak akan berjalan. Akan terjadi pesan error berikut : ‘Base.nama'isinaccessibleduetoitsprotectionlevel Lebih jauh lagi, jika sebuah class meng-inherit sebuah protected member, secara implisit, protected member tadi juga menjadi protected member dari derived class. Akibatnya, protected member dari suatu base class dapat diakses oleh semua class yang derived baik langsung maupun tidak langsung dari base class tersebut. Berikut adalah contoh dari class yang inherit dari class Derived yang sudah ada. Class ini tetap dapat mengakses member protected (dalam hal ini “nama”) dari base class, yaitu Base. Kode 4.14. public class DerivedMore: Derived { public string NamaJuga() { return nama + "juga"; } }
Perlu dicatat bahwa, inheritance hanya berlaku pada class. Tidak dapat diterapkan inheritance pada Struct. Artinya juga, access modifier protected tidak dapat dipakai di struct.
4.2.3.Base Class Constructor Sebuah derived class dapat memanggil constructor dari base class-nya. Ini dilakukan dengan menggunakan keyword base. Kode 4.15. public class Token { public Token(string name) { // codes } } public class CommentToken: Token { public CommentToken(string name): base(name) { //codes } }
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
10
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
Tanda titik dua yang diikuti constructor dari base class disebut sebagai constructor initializer. Selanjutnya, perhatikan contoh code dengan constructor tanpa parameter berikut :
Kode 4.16. public class Token { public Token() { // codes } }
Untuk memanggil consturctor dari base class dapat ditulis constructor initializer secara eksplisit seperti: Kode 4.17. public class CommentToken: Token { public { //codes } }
Akan tetapi, jika derived class tidak secara eksplisit memanggil constructor dari base class diatas, C# compiler akan secara implisit memanggil constructor initializer. Contoh code berikut adalah valid: Kode 4.18. public class CommentToken: Token { public CommentToken() // implisit { //codes } }
Hal ini dimungkinkan karena ci dalam .NET, sebuah class yang tidak memiliki base class yang eksplisit akan secara implisit men-derive class System.Object yang memiliki constructor tanpa parameter. Jika sebuah class tidak mempunyai constructor, secara automatis compiler C# akan membuat sebuah constructor public tanpa parameter yang disebut default constructor. Akan tetapi, jika di suatu class sudah memiliki constructornya sendiri, compiler C# tidak akan membuat default constructor. Akibatnya, jika sebuah derived class memiliki constructor yang tidak ada ‘pasangan’ yang sama di base-class-nya, code akan error. Contoh: Kode 4.19. public class Token { public Token(string name) { // codes } } public class CommentToken: Token { public CommentToken(string name) // invalid { //codes } }
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
11
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
Error terjadi karena secara implisit, consructor CommentToken memiliki constructor initializer “: base()”, sementara class Token tidak memiliki constructor tanpa parameter tersebut. Maka, contoh code diatas harus diubah seperti contoh code di awal sub-bab base constructor ini. Perlu diperhatikan juga bahwa, access modifier constructor berlaku sama dengan access modifier method biasa lainnya. Artinya, jika sebuah constructor adalah public, dia dapat di akses dari luar class, sedangkan jika suatu constructor adalah private, dia hanya bisa di akses oleh class itu sendiri. Selanjutnya, coba perhatikan kembali contoh code berikut: Kode 4.20. public class Base { protected string nama; } public class Derived: Base { public string Nama() { return nama; } }
Karena sebuah derived class dapat memiliki member dengan nama yang sama dengan base class, akan lebih baik jika digunakan keyword base untuk mengakses member class di suatu derived class. Sehingga contoh code diatas dapat dituliskan : Kode 4.21. public class Derived: Base { public string Nama() { return base.nama; } }
4.2.4.Implementasi Method Hal yang menarik dari inheritance adalah dapat dilakukan definisi ulang suatu implementasi method dari sebuah base class jika method base class tersebut didesain untuk dapat di override.
4.2.4.1.Virtual Method Untuk dapat membuat sebuah method dari suatu base class bisa di-override oleh derived class-nya, method tersebut harus diberi keyword virtual. Kode 4.22. public class Base { public virtual string nama() { //codes } }
Jadi, virtual method adalah method yang secara polymorphism dapat di override oleh derived lass. Method yang tidak virtual, tidak dapat di-derive oleh derived class. Beberapa hal yang harus diperhatikan : • Sebuah virtual method harus ada implementasinya di base class. Jika tidak ada implementasi, maka program akan error. • Sebuah virtual method tidak dapat diberi access modifier private. Jika method adalah private, hanya class pemilik method itu sendiri yang dapat mengaksesnya.
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
12
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
•
Sebuah virtual method juga tidak dapat dideklarasikan sebagai static. Polymorphism hanya berlaku pada object, bukan level class. Sementara static member adalah member dari class. Bukan object.
4.2.4.2.Override Method Jika pada base class method yang boleh di override harus diberi keyword virtual, maka pada derived class, method yang akan meng-override method base class tadi harus diberi keyword override. Contoh: Kode 4.23. public class Derived : Base { public override string nama() { // codes } }
Beberapa hal yang harus diperhatikan : • Sepertin halnya pada virtual method, pada override method harus juga terdapat implementasi code. Jika tidak, maka program akan error. • Signature dari override method harus sama dengan virtual method yang akan di override. • Seperti pada virtual method, override method juga tidak boleh static, dan tidak boleh private. Secara implisit, sebuah override method adalah virtual. Tetapi, tidak dapat dibuat secara eksplisit sebuah override method menjadi virtual. Contoh code berikut adalah invalid: Kode 4.24. public class Derived : Base { public virtual override string nama() // invalid { // codes } }
4.2.4.3.Keyword New Perhatikan contoh code berikut: Kode 4.25. public class Base { public string Nama() { // Codes } } public class Derived: Base { new public string Nama() { // codes } }
Keyword new pada method derived class diatas berfungsi untuk menyembunyikan method yang di-derived dari base class. Method yang di-derived dari base class diganti oleh method yang memiliki keyword new. Keyword new dapat menyembunyikan method virtual maupun non-virtual dari base class.
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
13
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
4.2.5.Sealed Class Pada banyak kasus, class dalam sebuah program adalah sebuah class yang stand alone. Maksudnya, class tersebut tidak dirancang untuk di-derrived. Akan tetapi, seorang developer dapat saja men-derrived sembarang class yang dia inginkan. Padahal class tersebut tidak untuk di-derrived. Untuk mencegah hal ini, di C# menggunakan keyword sealed. Sebuah class yang di deklarasi sebagai sealed class tidak dapat di-derrived. Kode 4.26. public sealed class Solitaire { //codes }
Class solitaire diatas tadi tidak akan bisa di-derriv. Maka dari itu, jika dicoba untuk menderrive class tersebut seperti contoh di bawah ini : Kode 4.27. public class Derivative: Solitaire // invalid { //codes }
Anda akan mendapat error message berikut: ‘Derivative':cannotinheritfrom sealedclass‘Solitaire'
4.3.Encapsulation Encapsulation sering juga dinyatakan sebagai penyembunyian informasi. Encapsulation memungkinkan seseorang untuk melakukan sesuatu tanpa perlu tahu secara mendetail tentang bagaimana sesuatu tersebut dilakukan. Contoh yang paling mudah adalah penggunaan remote control TV. Jika seseorang ingin memindahkan saluran TV dari satu saluran ke saluran lain, cukup dilakukan dengan menekan tombol saluran yang dikehendaki pada remote control. Orang tersebut tidak perlu tahu secara mendetail implementasi dari serangkaian mekanisme elektronik yang kompleks yang terjadi di dalam remote control dan TV . Itulah encapsulation. Menyembunyikan semua detail informasi dan mekanisme. Encapsulation menghilangkan ketergantungan pada implementasi. Sehingga, dimungkinkan untuk mengganti implementasi tanpa mengubah pengetahuan pengguna atau client. Pada contoh diatas, implementasi dari mekanisme elektronik pemindahan saluran pada remote control dan TV dapat saja diganti/diubah, tetapi bagi client tetap saja yang perlu diketahui adalah hanya bagaimana menekan tombol remote control. Encapsulation juga melindungi informasi internal dari suatu object. Client tidak dapat mengakses informasi internal tersebut. Client hanya dapat meminta suatu object untuk melakukan suatu operasi yang merubah informasi internal tadi. Contoh program dapat dilihat kembali pada kode 4.1. Pada program tersebut, pihak yang membuat class termo, tidak dapat mengetahui apa isi dan proses yang terjadi pada setiap variabel (jenis dan suhu) pada class termometer, ia hanya bisa menggunakan method ubahJenis, ubahSuhu yang disediakan pada class termometer. Pengguna class termometer juga tidak mengetahui bagaimana perhitungan yang terjadi pada setiap method suhuCel dan suhuFahr.
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
14
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
4.4.Interface Dalam OOP yang terpenting adalah apa yang bisa dilakukan oleh object, bukan bagaimana object melakukan sesuatu. Jadi pada suatu suatu object, yang menjadi fokus utama adalah “apa kemampuannya?”, bukan “bagaimana caranya?”. Poin yang penting adalah ada semacam tuntutan bahwa suatu object harus memenuhi kemampuan tertentu. Object dikatakan sebagai mesin cuci jika dia mampu mencuci. Siapapun yang pernah mengenal dan memakai mesin cuci akan dengan mudahnya akan mengerti bagaimana menggunakan mesin cuci, apapun mereknya. Terkadang juga apapun bahasanya. Ada semacam kesepakatan atau kontrak antar produsen mesin cuci, bahwa mesin cuci mesti mempunyai fungsi minimal seperti ini. Kontrak semacam ini dalam C# disebut sebagai Interface. Interface adalah komponen vital dan penting dalam dunia OOP.
4.4.1.Deklarasi Interface Berikut ini adalah deklarasi interface yang disederhanakan: Kode 4.28. modifier interface name { return-type method-name1(parameter-list); return-type method-name2(parameter-list); //--return-type method-nameN(parameter-list); }
Berikut ini contoh interface IMesinCuci: Kode 4.29. public interface IMesinCuci { void SetCuciTimer(Timer timer); void SetInput(Baju[] bajus); void SetSabun(Sabun sabun); void Cuci(); void SetKeringkanTimer(Timer timer); void Keringkan(); Baju[] GetBaju(); }
Huruf pertama dari nama interface, I, hanya masalah penamaan saja, digunakan karakter I untuk menandakan bahwa class ini adalah sebuah interface. Dalam interface tidak boleh ada implementasi method. Dan semua method adalah public. Semua class atau struct yang mengimplementasikan interface ini harus mengimplementasikan semua method tanpa kecuali. Dan tentunya tidak diperbolehkan membuat method static pada interface.
4.4.2.Implementasi Interface Berikut adalah deklarasi implementasi class yang memakai interface yang disederhanakan: Kode 4.30. class class-name:interface-name1,interface-name2{ //class-body }
Class yang mengimplementasikan interface wajib mengimplementasikan semua method secara public. Inteface yang diimplementasikan boleh lebih dari satu yang dipisahkan oleh koma. Berikut ini adalah contoh program implementasi interface mesin cuci :
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
15
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
Kode 4.31. using System; public interface IMesinCuci { void SetCuciTimer(Timer timer); void SetInput(Baju[] bajus); void SetSabun(Sabun sabun); void Cuci(); void SetKeringkanTimer(Timer timer); void Keringkan(); Baju[] GetBaju(); }
( interface )
public class Pembantu { private string _name; private object[] _keranjang; public Pembantu(string name) { _name=name; } public string Name { get{return _name;} } public void Mencuci(IMesinCuci mc, Sabun sabun, params Baju[] bajus) { mc.SetSabun(sabun); mc.SetInput(bajus); mc.SetCuciTimer(new Timer(20)); mc.Cuci(); mc.SetKeringkanTimer(new Timer(15)); mc.Keringkan(); _keranjang=mc.GetBaju(); } public void Menjemur() { Console.WriteLine("{0} menjemur baju sebanyak {1} buah.", this.Name, _keranjang.Length); foreach (Baju b in _keranjang) { Console.WriteLine("---Menjemur {0}...", b.Name); } Console.WriteLine("Selesai menjemur"); } } public class Timer { public Timer(int val) { _timer = val; } public int Value { get { return _timer; } } private int _timer; }
2
public class Baju { public Baju(string name) { _name=name; } public string Name { get{return _name; } } private string _name; public override string ToString(){ return "Test" + _name; } public class Sabun { public Sabun(string name) { _name=name; public string Name { get{return _name;} private string _name;
1
} }
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
3 }
4
16
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
} public class MCMerekFatur:IMesinCuci { private string _logo; private Timer _cuciTimer; private Timer _keringkanTimer; private Baju[] _drum; private Sabun _sabun; public MCMerekFatur() { _logo="Fatur Oye"; } public string GetLogo() { return "Logo : " + this._logo ; } #region implementasi IMesinCuci public void SetCuciTimer(Timer timer) { _cuciTimer=timer; } public void SetKeringkanTimer(Timer timer) { _keringkanTimer=timer; } public void SetInput(params Baju[] bajus) { _drum=bajus; } public void SetSabun(Sabun sabun) { _sabun=sabun; } public void Cuci() { Console.WriteLine("Anda Sedang Menggunakan {0} ",this.GetLogo()); Console.WriteLine("Masukkan sabun {0} ",_sabun.Name); Console.WriteLine("Mulai mencuciii...."); for(int i=1;i<=_cuciTimer.Value;i++) { Console.WriteLine("Putaran ke {0} ", i); } Console.WriteLine("Priiiit, Priiiit mencuci selesai"); } public void Keringkan() { Console.WriteLine("Mulai mengeringkan...."); for(int i=1;i<=_keringkanTimer.Value;i++) { Console.WriteLine("Putaran ke {0} ", i); } Console.WriteLine("Priiiit, Priiiit mengeringan selesai"); } public Baju[] GetBaju() { Console.WriteLine("Ngiiing buka tutup"); for(int i=0;i<_drum.Length;i++) { //Baju b =_drum[i] as Baju; Console.WriteLine("Keluarkan {0}",_drum[i].Name); } Console.WriteLine("Nguiiinnng Tutup Kembali"); Console.WriteLine("Terimakasih Anda Telah Menggunakan {0} ",this.GetLogo()); return _drum; } #endregion }
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
5
17
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
public class UnitTest { public static void Main() { MCMerekFatur mcf=new MCMerekFatur(); Baju celana=new Baju("Jeans"); Baju kaos=new Baju("Oblong"); Baju hem=new Baju("Executive"); Baju celdam=new Baju("GT-Man"); Baju kaoskaki=new Baju("Snoopy"); Baju kutang =new Baju("Kutang"); Sabun rinso=new Sabun("Attack"); Pembantu inem=new Pembantu("Inem"); inem.Mencuci(mcf,rinso,celana,kaos, hem,celdam,kaoskaki,kutang); inem.Menjemur(); Console.ReadKey(); } }
6
Keterangan : (interface) : interface yang dibuat, dengan nama ImesinCuci. (1) class pembantu yang perlu dibuat karena digunakan pada interface IMesinCuci. (2) class timer yang perlu dibuat karena digunakan pada interface IMesinCuci. (3) class baju yang perlu dibuat karena digunakan pada interface IMesinCuci. (4) class sabun yang perlu dibuat karena digunakan pada interface IMesinCuci. (5) class MCMerekFatur yang merupakan implementasi dari interface IMesinCuci. (6) class UnitTest yang merupakan class yang digunakan untuk membuat object dari class MCMerekFatur. Class (1) , (2) , (3) dan (4) merupakan class tambahan yang harus dibuat untuk melengkapi program karena telah dideklarasikan pada interface IMesinCuci. Class (5) merupakan class yang dibuat sebagai implementasi dari interface IMesinCuci. Pada class ini harus diimplementasikan setiap method yang ada di dalam interface IMesinCuci. Setiap method tersebut harus diimplementasikan secara public. Isi atau proses yang dilakukan pada setiap method tidak dibatasi. Class unitTest (6) merupakan class yang didalamnya dibuat satu object yang merupakan instance dari class MCMerekFatur (5). Object ini sama seperti object lainnya yang juga merupakan instance dari suatu class. Dengan demikian object mcf ini memiliki semua method yang ada pada class MCMerekFatur. Contoh penggunaan interface yang lebih sederhana : Kode 4.32 using System; using System.Collections.Generic; using System.Text; public interface iGelas { void diBersihkan(); void diIsi(string minuman); void dipakai(); } public class cangkir : iGelas { private string lokasi; private string kondisi;
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
18
Modul IT210 Pemrograman Visual Fakultas Teknologi Informasi – Universitas Kristen Satya Wacana
private string isi; public cangkir() { this.lokasi = "rak piring"; this.kondisi = "bersih"; this.isi = ""; } public void diBersihkan(){ this.kondisi = "bersih"; this.lokasi = "rak piring"; this.isi = ""; } public void diIsi(string minuman) { this.isi = minuman; this.lokasi = "meja"; this.kondisi = "siap minum"; } public void dipakai() { this.lokasi = "tempat cuci piring"; this.kondisi = "kotor"; this.isi= ""; } public string status() { return "\nlokasi: " + this.lokasi + "\nkondisi: " + this.kondisi + "\nisi : " + this.isi; } } class Program { static void Main(string[] args) { Console.WriteLine("\n*** buat class cangkir baru"); cangkir biru = new cangkir(); Console.WriteLine(biru.status()); Console.WriteLine("\n*** isi dengan susu"); biru.diIsi("susu"); Console.WriteLine(biru.status()); Console.WriteLine("\n*** diminum"); biru.dipakai(); Console.WriteLine(biru.status()); Console.WriteLine("\n*** cangkir dicuci"); biru.diBersihkan(); Console.WriteLine(biru.status()); Console.ReadKey(); } }
Pada contoh kode 4.32, dibuat interface iGelas yang didalamnya dituliskan 3 buah method. Ingat, bahwa method yang dituliskan di dalam interface tidak memiliki body. Class cangkir yang dibuat setelahnya, merupakan implementasi dari interface iGelas. Dengan demikian harus pula dilakukan tiga buah method yang ada pada interface iGelas disertai proses yang dilakukan pada setiap method. Class program merupakan class yang digyunakan untuk menciptakan object yang merupakan instance dari class cangkir. Di dalam class ini juga ditunjukkan cara dan hasil pemanggilan method yang ada pada class cangkir menggunakan object yang dibuat tersebut (biru).
Jasson Presttiliano, ST; Dian W. Chandra, S.Kom; Yos Richard Beeh, ST;
19