PENDAHULUAN
1.1 Pengenalan Framework .NET
Framework .NET adalah suatu komponen windows yang terintegrasi yang
dibuat dengan tujuan untuk mensupport pengembangan berbagai macam jenis
aplikasi serta untuk dapat mejalankan berbagai macam aplikasi generasi
mendatang termasuk pengembangan aplikasi Web Services XML.Framework .NET di design untuk dapat memenuhi beberapa tujuan berikut ini :
- · Untuk menyediakan environment kerja yang konsisten bagi bahasa pemrograman yang berorientasi objek (object-oriented programming – OOP) baik kode objek itu di simpan dan di eksekusi secara lokal, atau dieksekusi secara lokal tapi didistribusikan melalui internet atau dieksekusi secara remote.
- · Untuk menyediakan environment kerja di dalam mengeksekusi kode yang dapat meminimaliasi proses software deployment dan menghindari konflik penggunaan versi software yang di buat.
- · Untuk menyediakan environment kerja yang aman dalam hal pengeksekusian kode, termasuk kode yang dibuat oleh pihak ketiga (third party).
- · Untuk menyediakan environment kerja yang dapat mengurangi masalah pada persoalan performa dari kode atau dari lingkungan interpreter nya.
- · Membuat para developer lebih mudah mengembangkan berbagai macam jenis aplikasi yang lebih bervariasi, seperti aplikasi berbasis windows danaplikasi berbasis web.
- · Membangun semua komunikasi yang ada di dalam standar industri untuk
- · memastikan bahwa semua kode aplikasi yang berbasis Framework .NET dapat
- · Berintegrasi dengan berbagai macam kode aplikasi lain.
Ada dua komponen utama dalam Framework .NET yaitu Common Language Runtime (CLR) dan .NET Framework Class Library. Common Language Runtime (CLR) adalah pondasi utama dari Framework .NET. CLR merupakan komponen yang bertanggung jawab terhadap berbagai macam hal, seperti bertanggung jawab untuk melakukan managemen memory, melakukan eksekusi kode, melakukan verifikasi terhadap keamanan kode, menentukan hak akses dari kode, melakukan kompilasi kode, dan berbagai layanan system lainnya. Dengan adanya fungsi CLR ini, maka aplikasi berbasis .NET biasa juga disebut dengan managed code, sedangkan aplikasi di luar itu biasa disebut dengan un-managed code. CLR akan melakukan kompilasi kode-kode aplikasi kita menjadi bahasa assembly MSIL (Microsoft Intermediate Language). Proses kompilasi ini sendiri dilakukan oleh komponen yang bernama Just In Time (JIT). JIT hanya akan mengkompilasi metode metode yang memang digunakan dalam aplikasi, dan hasil kompilasi ini sendiri di chace di dalam mesin dan akan dikompile kembali jika memang ada perubahan pada kode aplikasi kita.
.NET Framework Class Library atau sering juga disebut Base Case Library (BCL) adalah koleksi dari reusable types yang sangat terintegrasi secara melekat dengan CLR. Class library bersifat berorientasi terhadap objek yang akan menyediakan types dari fungsi-fungsi managed code. Hal ini tidak hanya berpengaruh kepada kemudahan dalam hal penggunaan, tetapi juga dapat mengurangi waktu yang diperlukan pada saat eksekusi. Dengan sifat tersebut, maka komponen pihak ketiga akan dengan mudah diaplikasikan ke dalam aplikasi yang dibuat. Dengan adanya BCL ini, maka kita bisa menggunakan Framework .NET untuk membuat berbagai macam aplikasi, seperti :
- · Aplikasi console
- · Aplikasi berbasis windowd (Windows Form)
- · Aplikasi ASP.NET (berbasis web)
- · Aplikasi Web Services XML
- · Aplikasi berbasis Windows Services
BAB II
PENGENALAN BAHASA C# (DIBACA ““SEE-SHARP”)
C# adalah bahasa pemrograman baru yang diciptakan oleh Microsoft
yang dikembangkan dibawah kepemimpinan Anders Hejlsberg yang telah
menciptakan berbagai macam bahasa pemrograman termasuk Borland Turbo C++
dan orland Delphi. Bahasa C# juga telah di standarisasi secara
internasional oleh ECMA. Seperti halnya bahasa pemrograman yang lain, C#
bisa digunakan untuk membangun berbagai macam jenis aplikasi, seperti
aplikasi berbasis windows (desktop) dan aplikasi berbasis web serta
aplikasi berbasis web services.2.1 Feature dalam C#
Sebagai bahasa pemrograman baru C# banyak mengadopsi feature dari beberapa bahasa perogrmaan terkenal dan banyak komunitasnya tetapi yang paling dominan adalah Java adapun komposisinya adalah sebagai berikut 70% Java, 10% C++, 5% Visual Basic, 15% baru.
Feature yang sama dengan JAVA
• Object-orientation (single inheritance)
• Interfaces
• Exceptions
• Threads
• Namespaces (like Packages)
• Strong typing
• Garbage Collection
• Reflection
• Dynamic loading Code
• …..
• (Operator) Overloading
• Pointer arithmetic in unsafe code
• Some syntactic details
Adapun Feature barunya jika dikomper dengan Java adalah sebagai berikut :
• Reference and output parameters
• Objects on the stack (structs)
• Rectangular arrays
• Enumerations
• Unified type system
• goto
• Versioning
• Component-based programming
- Properties
- Events
• Delegates
• Indexers
• Operator overloading
• foreach statements
• Boxing/unboxing
• Attributes
2.2 Key word C#
C# adalah bahasa pemrograman yang menggunakan jumlah kata-kata yang tidak terlalu banyak. C# hanya berisi kata-kata yang biasa disebut dengan keywords. Keywords ini digunakan untuk menjelaskan berbagai macam informasi. Berikut daftar keywords yang ada dalam bahasa C# :
abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static stringstruct switch this throw true try typeof uint ulong unchecked unsafeushort using virtual void while
2.3 Struktur File C#
2.4 Penulisan Kode C#
Langkah-langkah penulisan kode C#
1. Kode program diawali dengan mendeklarasikan nama Class atau namespace
2. Aplikasi dibuka dengan tanda “{“ dan pada akhir kode ditutup dengan tanda “}”.
3. Aplikasi C# dibangun oleh satu atau beberapa fungsi yang diletakan di dalam sebuah Class dengan ketentuan sebagai berikut .
- · Nama suatu fungsi pada C# harus diawali dengan huruf, atau garis bawah “_” yang kemudian bisa diikuti oleh huruf, angka atau garis bawah.
- · Pada bagian akhir nama fungsi digunakan tanda kurung buka dan kurung tutup “()”.
- · Penamaan fungsi tidak boleh mengandung spasi. Awal dan akhir suatu fungsi di mulai dengan tanda “{“ dan diakhiri dengan tanda “}”.
- · Penulisan komentar ( tulisan yang tidak di eksekusi) dapat dibuat sebagai berikut
- · Komentar satu baris dengan menggunakan tanda “//”
- · Komenter yang lebih dari satu baris dengan di awali tanda “/*” dan diakhiri oleh “*/”
Contoh program yang paling sederhana untuk file Hallo.cs class HelloWorld
{
// Bagian utama program C# à ini adalah contoh komentar 1 baris
public static void Main()
{
System.Console.WriteLine(“Hello, World”);
}
/* ini cantoh komentar2.5. Escape Sequences
lebih dari satu baris */
}
Escape Sequences adalah karakter-karakter khusus yang tidak akan itampilkan.
Contohnya, ada karakter yang digunakan sebagai tanda akhir dari suatu baris
yang memerintahkan program untuk melanjutkan ke baris berikutnya. Cara
penulisannya diawali dengan tanda \ diikuti dengan karakter khusus (dalam
contoh ini adalah “n”) sehingga penulisannya menjadi \n.
BAB III
TIPE DATA DAN VARIABLE
3.1 Tipe Data (Data Type)Dalam membuat suatu aplikasi akan dijumpai berbagai jenis tipe data. Setiap tipe data memiliki fungsi yang berbeda-beda antara satu tipe data dengan yang lainnya. Berikut ini penjelasan tipe data dalam C#.
3.1.1 Unified Type System
3.1.2 Value Types versus Reference Types
3.1.3 Simple Type
Long Form in Java Range
sbyte System.SByte byte -128 .. 127
byte System.Byte — 0 .. 255
short System.Int16 short -32768 .. 32767
ushort System.UInt16 — 0 .. 65535
int System.Int32 int -2147483648 ..2147483647
uint System.UInt32 — 0 .. 4294967295
long System.Int64 long -263 .. 263-1
ulong System.UInt64 — 0 .. 264-1
float System.Single float ±1.5E-45 .. ±3.4E38 (32 Bit)
double System.Double double ±5E-324 .. ±1.7E308 (64 Bit)
decimal System.Decimal — ±1E-28 .. ±7.9E28 (128 Bit)
bool System.Boolean boolean true, false
char System.Char char Unicode character
Variabel
Variabel dapat didefinisikan sebagai tempat untuk menyimpan data yang memiliki suatu Tipe data, variabel ini akan diwakili oleh suatu lokasi di memori komputer kita. Dengan nggunakan nama variabel ini kita akan dapat mengaskes data yang tersimpan di memori tersebut.
Penamaan Variabel
Aturan dalam pembuatan variable adalah sebagai berikut :
- · Terdiri dari huruf, angka dan under score (_)
- · Nama harus diawali dengan huruf. Under score juga dapat digunakan untuk mengawali nama suatu variabel tetapi ini tidak disarankan.
- · C# adalah bahasa yang case sensitif, variabel dengan nama umur tidak sama dengan Umur.
- · Keyword tidak bisa digunakan sebagai nama variabel, kecuali kalau keyword ini diawali dengan karakter @.
Nama Variabel Benar/Salah
KodeBarang Benar
Nama_barang Benar
_Jumlah Benar : tetapi tidak disarankan
@int Benar : keyword diawali dengan @
Int Salah : karena int adalah keyword
Harga Barang Salah : menggunakan spasi
Harga#barang Salah : menggunakan tanda #
1X Salah : diawali oleh angka
@int Benar : keyword diawali dengan @
3.2.2 Deklarasi Variable
Ada 3 cara dalam mendeklarasikan/penulisan Variabel adalah sebagai berikut
1. TypeData Nama_variabel;
Contoh :
string nama_barang;2. TypeData Nama_variabel=initial_value
int jumlah;
nama_barang=”Buku”;
jumlah=2;
Initial_value dalah nilai awal yang diberikan terhadap variable tersebut ketika variable tersebut pertama kali dibaca
Contoh :
string nama_barang=”Buku”;
int jumlah=2;
3. TypeData Nama_variabel1, Nama_variabel2, Nama_variabel2;
Apabila ada beberapa variable yang mememiliki tipe data yang sama maka dapat ditulis sebagai berikut :
string kode_barang,nama_barang;
Arithmetic Operator (Operator Aritmatika)
menggunakan operator arithmetic dasar :
Operator Aksi Contoh Penejelasan
+ Penjumlahan 5 + 9 Menghasilkan nilai : 14
- Pengurangan 9 – 4 Menghasilkan nilai : 5
* Perkalian 5 * 6 Menghasilkan nilai : 30
/ Pembagian 20 / 4 Menghasilkan nilai : 5
% Modulus 9 % 4 Menghasilkan nilai : 1
Beberapa operator perbandingan yang lain adalah sebagai berikut :
Operator Arti Contoh Menghasilkan benar (true) ketika :
== Sama dengan $i == $j $i dan $j mempunyai nilai yang sama
< Kurang dari $i < $j $i kurang dari $j
> Lebih dari $i > $j $i lebih dari $j
<= Kurang dari atau sama dengan $i <= $j $i kurang dari atau sama dengan $j
>= Lebih dari atau sama dengan $i >= $j $i lebih dari atau sama dengan $j
!= Tidak sama dengan $i != $j $i tidak sama dengan $j
<> Tidak sama dengan $i <> $j $i tidak sama dengan $j
Komentar (Remark)
n /* … */
n //
n #
BAB IV
SELECTION
Toeri :
Selection statement digunakan untuk menentukan bagian mana dari
program yang akan dieksekusi selanjutnya. C# menyediakan dua jenis
selection yaitu if dan switch4.1 if
If statement digunakan untuk mengeksekusi kode program jika kondisi tertentu terpenuhi.
Formula
If (kriteria)
{
Statement bernilai True (sesuai dengan criteria)
}
Contoh:
class ContohIf4.2 if – else
{
public static void Main2()
{
Console.Write(“Masukkan nilai x : “);
int x = int.Parse(Console.ReadLine());
Console.Write(“Masukkan nilai y : “);
int y = int.Parse(Console.ReadLine());
if (y!=0)
{
double hasil = x/y;
Console.WriteLine(“Hasil pembagian x/y = {0}”,hasil);
}
Console.ReadLine();
}
}
Satu variasi dari if statement adalah if-else. Dalam statement ini, selain menentukan langkah apa yang harus dilakukan jika suatu kondisi terpenuhi, kita juga bisa menentukan langkah apa yang mesti dilakukan kalau kondisi tersebut TIDAK terpenuhi.
Formula4.3 if else if
If (kriteria)
{
Statement bernilai True (sesuai dengan kriteria)
}
else
{
Statement bernilai false (tidak sesuai dengan kriteria)
}
class ContohIfElse
{
public static void Main2()
{
Console.Write(“Masukkan nilai x : “);
int x = int.Parse(Console.ReadLine());
Console.Write(“Masukkan nilai y : “);
int y = int.Parse(Console.ReadLine());
if (y!=0)
{
double hasil = x/y;
Console.WriteLine(“Hasil pembagian x/y = {0}”,hasil);
}
else
{
Console.WriteLine(“y bernilai 0″);
}
Console.ReadLine();
}
}
Satu variasi dari if statement adalah if-else. Dalam statement ini, selain menentukan
langkah apa yang harus dilakukan jika suatu kondisi terpenuhi, kita juga bisa
menentukan langkah apa yang mesti dilakukan kalau kondisi tersebut TIDAK terpenuhi.
Formula
If (kriteria1)
{
Statement bernilai True (sesuai dengan kriteria1
}
else if (kriteria2)
{
Statement bernilai True (sesuai dengan kriteria2
}
4.4 Switch
Logika dari statement switch secara prinsip sama dengan stement if
Praktek 3
class ContohSwitch
{
public static void Main2()
{
switch (DateTime.Now.DayOfWeek)
{
case DayOfWeek.Sunday:
{
Console.WriteLine(“Sekarang hari Minggu”);
break;
}
case DayOfWeek.Monday:
{
Console.WriteLine(“Sekarang hari Senin”);
break;
}
case DayOfWeek.Tuesday:
{
Console.WriteLine(“Sekarang hari Selasa”);
break;
}
default:
{
Console.WriteLine(“Sekarang hari apa ya?”);
break;
}
}
Console.ReadLine();
}
}
BAB V
ITERASI
Iteration statement adalah jenis perintah yang digunakan untuk
menentukan bagian mana dari program yang akan dieksekusi berulang-ulang
dan kondisi apa yang menentukan perulangan tersebut.5.1 While
while statement berguna untuk melakukan perulangan selama kondisi true.
Formula5.2 Do while
while (kondisi iterasi)
{
Statement yang diulang
}
Contoh program
using System;
class ContohWhile
{
public static void Main ()
{
int i = 0;
while (i<10)
{
if (i%2==0)
{
Console.WriteLine(“Angka genap: ” + i);
}
i += 1;
}
Console.ReadLine();
}
}
Statemen do memiliki kesamaan dengan statement while yaitu untuk melakukan
perulangan
Formula5.3 For
do
{
Statement yang diulang
}
while (kondisi iterasi)
Contoh program
using System;
class ContohDo
{
public static void Main()
{
int i = 0;
do
{
if (i%2==0)
{
Console.WriteLine(“Angka genap: ” + i);
}
i += 1;
}
while (i<10);
Console.ReadLine();
}
}
For digunakan untuk melakukan perulangan yang didasarkan atas nilai diskrit
misalnya integer
Formula
for (nilai awal, kondisi akhir, step pengulangan)
{
Statemen yang akan diulang
}
Contoh :
using System;
class ContohFor
{
public static void Main2()
{
string[] drives = System.Environment.GetLogicalDrives();
for (int i=0; i<drives.Length; i++)
{
Console.WriteLine(“drive ” + drives[i]);
}
Console.ReadLine();
}
}
5.4 Foreach
Statement Foreach digunakan utuk menelusuri collection, misalnya array
Contoh :
using System;
class ContohForeach
{
public static void Main2()
{
string[] drives = System.Environment.GetLogicalDrives();
foreach (string drive in drives)
{
Console.WriteLine(“drive ” + drive);
}
Console.ReadLine();
}
}
BAB VI
JUMP STATEMENT
Jump Statement berfungsi untuk mentransfer kontrol eksekusi dari suatu bagian ke bagian yang lain.6.1 Break
Statement break berfungsi untuk keluar dari statement for, while, do dan switch yang pernah dibahas sebelumnya.
Contoh :
using System;6.2 continue
class ContohBreak
{
public static void Main()
{
for (int i=0; i<10; i++)
{
Console.WriteLine(“i=” + i);
if (i==5) break;
}
Console.ReadLine();
}
}
Statement continue berfungsi melanjutkan eksekusi program ke iterasi berikutnya :
Contoh :
using System;6.3 goto
class ContohContinue
{
public static void Main2()
{
for (int i=0; i<10; i++)
{
if (i==5) continue;
Console.WriteLine(“i=” + i);
}
Console.ReadLine();
}
}
statement goto berfungsi untuk melanjutkan ekseskusi ke label yang telah didefinisikan sebelumnya
contoh :
using System;6.5 throw
class ContohGoto
{
public static void Main2()
{
for (int i=0; i<10; i++)
{
if (i==5) goto selesai;
Console.WriteLine(“i=” + i);
}
selesai:
Console.ReadLine();
}
}
6.4 return
Statement return digunakan untuk mengembalikan kontrol ekseskusi ke pemanggil.
using System;
class ContohReturn
{
public static void FungsiB()
{
Console.WriteLine(“FungsiB”);
Console.WriteLine(“Akan menjalankan return …”);
return;
}
public static void FungsiA()
{
Console.WriteLine(“FungsiA”);
Console.WriteLine(“Akan memanggil FungsiB”);
FungsiB();
Console.WriteLine(“Melanjutkan perintah FungsiA berikutnya”);
}
Konsep Bahasa Pemrograman dengan C#
Oleh : Muhamad Zen SKom.M.M
public static void Main2()
{
FungsiA();
Console.ReadLine();
}
}
statement throw digunakan untuk membangkitkan exceptionI dalam program.
Contoh
using System;
class ContohThrow
{
public static void Main2()
{
try
{
Console.Write(“Ketik nama Anda: “);
string nama = Console.ReadLine();
if (nama!=”risman”)
throw new System.ApplicationException(“Nama tidak dikenal”);
Console.Write(“Selamat, Anda termasuk orang terkenal “);
}
catch(ApplicationException ae)
{
Console.WriteLine (“Exception: ” + ae.Message);
}
Console.ReadLine();
}
}
BAB VII
METHOD
Method adalah bagian dari tubuh program yang mengimplementasikan suatu action sehingga class atau object bekerja.7.1 Static Methods
Method dapat di overload, yaitu nama suatu method dapat dipakai berkali-kali
selama method tersebut memiliki sesuatu yang unik. Static method hanya
bisa diakses melalui classnya saja.
Contoh
class Program7.2 non static metho
{
static void contohmethod()
{
Console.WriteLine(“Method Tanpa Parameters”);
}
static void contohmethod(int value1,int value2)
{
Console.WriteLine(“Nilai dari parameter1 ” + value1.ToString() );
Console.WriteLine(“Nilai dari parameter2 ” + value2.ToString());
}
static void contohmethod(ref int value)
{
value = value + 9;
Console.WriteLine(“Nilai Parameters dengan metoda Ref ” + value.ToString() );
}
static void Main(string[] args)
{
contohmethod();
int v1 = 10;
int v2 = 20;
contohmethod(v1, v2);
int r = 10;
contohmethod(ref r);
Console.ReadLine();
}
}
non static method adalah method yang dapat diakses melalui instance-nya
contoh :
class First
{
public virtual void one()
{
Console.WriteLine(“Class First One”);
}
}
class Second : First
{
public override void one()
{
Console.WriteLine(“Class Second One”);
}
}
class Program
{
static void Main(string[] args)
{
First x = new First() ;
Second y = new Second() ;
x.one();
y.one();
Console.ReadLine();
}
}
Praktek Konsep Bahasa Pemrograman (C#)
- 1. Operasional Variabel
Variabel dapat didefinisikan sebagai tempat untuk menyimpan data yang memiliki suatu Tipe data, variabel ini akan diwakili oleh suatu lokasi di memori komputer kita. Dengan nggunakan nama variabel ini kita akan dapat mengaskes data yang tersimpan di memori tersebut.
Penamaan Variabel
Aturan dalam pembuatan variable adalah sebagai berikut :
- Terdiri dari huruf, angka dan under score (_)
- Nama harus diawali dengan huruf. Under score juga dapat digunakan
untuk mengawali nama suatu variabel tetapi ini tidak disarankan.
- C# adalah bahasa yang case sensitif, variabel dengan nama umur tidak sama
- Keyword tidak bisa digunakan sebagai nama variabel, kecuali kalau keyword ini diawali dengan karakter @.
Nama Variabel
|
Benar/Salah
|
KodeBarang | Benar |
Nama_barang | Benar |
_Jumlah | Benar : tetapi tidak disarankan |
@int | Benar : keyword diawali dengan @ |
Int | Salah : karena int adalah keyword |
Harga Barang | Salah : menggunakan spasi |
Ada 3 cara dalam mendeklarasikan/penulisan Variabel adalah sebagai berikut
- TypeData Nama_variabel;
string nama_barang;
int jumlah;
nama_barang=”Buku”;
jumlah=2;
- TypeData Nama_variabel=initial_value
Contoh :
string nama_barang=”Buku”;
int jumlah=2;
- TypeData Nama_variabel1, Nama_variabel2, Nama_variabel2;
string kode_barang,nama_barang;
Praktek 1. Membaca Nilai dari suatu variabel
class Bacanilaivariabel
{
static void Main(string[] args)
{
string nip = “200722001″;
string nama = “M. Zen”;
int nilai = 85;
Console.WriteLine(“Nip ” + nip);
Console.WriteLine(“Nama ” + nama );
Console.WriteLine(“Nilai ” + nilai.ToString());
Console.ReadLine();
}
}
Keterangan :
Console.WriteLine : Menampilkan satu baris Teks di layar dan kursor akan pindah kebaris berikutnya
Console.ReadLine : Membaca Input Nilai dari suatu vairiabel dan setelah penulisan kursor akan berpindah kebaris berikutnya
Praktek 2 Input Variabel
class inputvariabel
{
static void Main(string[] args)
{
float total
Console.Write(“NAMA : “);
string x = Console.ReadLine()
Console.Write(“Gaji : “);
float gaji = float.Parse(Console.ReadLine());
Console.Write(“Tunjangan : “);
float tunjangan = float.Parse(Console.ReadLine());
Console.Write(“potongan : “);
float potongan = float.Parse(Console.ReadLine());
total = gaji + tunjangan – potongan;
Console.WriteLine(“Total Gaji :” + total.ToString());
Console.ReadLine();
}
}
- 2. Selection Statemen
Selection statement digunakan untuk menentukan bagian mana dari program yang akan
Dieksekusi selanjutnya. C# menyediakan dua jenis selection yaitu if danswitch.
2.1 if
If statement digunakan untuk mengeksekusi kode program jika kondisi tertentu
terpenuhi.
Praktek 1.
class ContohIf
{
public static void Main2()
{
Console.Write(“Masukkan nilai x : “);
int x = int.Parse(Console.ReadLine());
Console.Write(“Masukkan nilai y : “);
int y = int.Parse(Console.ReadLine());
if (y!=0)
{
double hasil = x/y;
Console.WriteLine(“Hasil pembagian x/y = {0}”,hasil);
}
Console.ReadLine();
}
}
2.2 if else
Satu variasi dari if statement adalah if-else. Dalam statement ini, selain menentukan
langka apa yang harus dilakukan jika suatu kondisi terpenuhi, kita juga bisa
menentukan langkah apa yang mesti dilakukan kalau kondisi tersebut TIDAK terpenuhi.
Praktek 2
class ContohIfElse2.3 Switch
{
public static void Main2()
{
Console.Write(“Masukkan nilai x : “);
int x = int.Parse(Console.ReadLine());
Console.Write(“Masukkan nilai y : “);
int y = int.Parse(Console.ReadLine());
if (y!=0)
{
double hasil = x/y;
Console.WriteLine(“Hasil pembagian x/y = {0}”,hasil);
}
else
{
Console.WriteLine(“y bernilai 0″);
}
Console.ReadLine();
}
}
Logika dari statement switch secara prinsip sama dengan stement if
Praktek 3
class ContohSwitch
{
public static void Main2()
{
switch (DateTime.Now.DayOfWeek)
{
case DayOfWeek.Sunday:
{
Console.WriteLine(“Sekarang hari Minggu”);
break;
}
case DayOfWeek.Monday:
{
Console.WriteLine(“Sekarang hari Senin”);
break;
}
case DayOfWeek.Tuesday:
{
Console.WriteLine(“Sekarang hari Selasa”);
break;
}
default:
{
Console.WriteLine(“Sekarang hari apa ya?”);
break;
}
}
Console.ReadLine();
}
}
- 3. ARRAY
3.1 Meng- initialize array
- Dengan menggunakan keyword new untuk menentukan jumlah element array
contoh
string[] namabulan = new string[12];
namabulan[0]=” ”;
namabulan[1]=”januari”;
namabulan[12]=”Desember”
- Dengan cara memberikan nilai saat deklarasi array
Contoh :
String[] namabulan={“Januari”,”Pebruari”,”…”,”Desember”}
String[] namabulan=new string[] {“Januari”,”Pebruari”,”…”,”Desember”}
4. ITERATION STATEMENT
Iteration statement adalah jenis perintah yang digunakan untuk menentukan bagian mana dari program yang akan dieksekusi berulang-ulang dan kondisi apa yang menentukan perulangan tersebut.
while
while statement berguna untuk melakukan perulangan selama kondisi true.
Contoh program
using System;DO
class ContohWhile
{
public static void Main ()
{
int i = 0;
while (i<10)
{
if (i%2==0)
{
Console.WriteLine(“Angka genap: ” + i);
}
i += 1;
}
Console.ReadLine();
}
}
Statemen DO memiliki kesamaan dengan statement while yaitu untuk melakukan perulangan
Contoh program
using System;For
class ContohDo
{
public static void Main()
{
int i = 0;
do
{
if (i%2==0)
{
Console.WriteLine(“Angka genap: ” + i);
}
i += 1;
}
while (i<10);
Console.ReadLine();
}
}
For digunakan untuk melakukan perulangan yang didasarkan atas nilai diskrit misalnya integer
Contoh :
using System;Foreach
class ContohFor
{
public static void Main2()
{
string[] drives = System.Environment.GetLogicalDrives();
for (int i=0; i<drives.Length; i++)
{
Console.WriteLine(“drive ” + drives[i]);
}
Console.ReadLine();
}
}
Statement Foreach digunakan utuk menelusuri collection, misalnya array
Contoh :
using System;5. JUMP STATEMENT
class ContohForeach
{
public static void Main2()
{
string[] drives = System.Environment.GetLogicalDrives();
foreach (string drive in drives)
{
Console.WriteLine(“drive ” + drive);
}
Console.ReadLine();
}
}
Jump Statement berfungsi untuk mentransfer kontrol eksekusi dari suatu bagian ke bagian yang lain.
Break
Statement break berfungsi untuk keluar dari statement for, while, do dan switch yang pernah dibahas sebelumnya.
Contoh :
using System;continue
class ContohBreak
{
public static void Main()
{
for (int i=0; i<10; i++)
{
Console.WriteLine(“i=” + i);
if (i==5) break;
}
Console.ReadLine();
}
}
Statement continue berfungsi melanjutkan eksekusi program ke iterasi berikutnya :
Contoh :
using System;
class ContohContinue
{
public static void Main2()
{
for (int i=0; i<10; i++)
{
if (i==5) continue;
Console.WriteLine(“i=” + i);
}
Console.ReadLine();
}
}
goto
statement goto berfungsi untuk melanjutkan ekseskusi ke label yang telah didefinisikan sebelumnya
contoh :
using System;
class ContohGoto
{
public static void Main2()
{
for (int i=0; i<10; i++)
{
if (i==5) goto selesai;
Console.WriteLine(“i=” + i);
}
selesai:
Console.ReadLine();
}
}
return
Statement return digunakan untuk mengembalikan kontrol ekseskusi ke pemanggil.
using System;throw
class ContohReturn
{
public static void FungsiB()
{
Console.WriteLine(“FungsiB”);
Console.WriteLine(“Akan menjalankan return …”);
return;
}
public static void FungsiA()
{
Console.WriteLine(“FungsiA”);
Console.WriteLine(“Akan memanggil FungsiB”);
FungsiB();
Console.WriteLine(“Melanjutkan perintah FungsiA berikutnya”);
}
public static void Main2()
{
FungsiA();
Console.ReadLine();
}
}
statement throw digunakan untuk membangkitkan exceptionI dalam program.
Contoh
using System;6. Method
class ContohThrow
{
public static void Main2()
{
try
{
Console.Write(“Ketik nama Anda: “);
string nama = Console.ReadLine();
if (nama!=”risman”)
throw new System.ApplicationException(“Nama tidak dikenal”);
Console.Write(“Selamat, Anda termasuk orang terkenal “);
}
catch(ApplicationException ae)
{
Console.WriteLine (“Exception: ” + ae.Message);
}
Console.ReadLine();
}
}
Method adalah bagian dari tubuh program yang mengimplementasikan suatu action sehingga class atau object bekerja.
6.1 Static Methods
Method dapat di overload, yaitu nama suatu method dapat dipakai berkali-kali selama method tersebut memiliki sesuatu yang unik. Static method hanya bisa diakses melalui classnya saja.
Contoh
class Program6.2 non static method
{
static void contohmethod()
{
Console.WriteLine(“Method Tanpa Parameters”);
}
static void contohmethod(int value1,int value2)
{
Console.WriteLine(“Nilai dari parameter1 ” + value1.ToString() );
Console.WriteLine(“Nilai dari parameter2 ” + value2.ToString());
}
static void contohmethod(ref int value)
{
value = value + 9;
Console.WriteLine(“Nilai Parameters dengan metoda Ref ” + value.ToString() );
}
static void Main(string[] args)
{
contohmethod();
int v1 = 10;
int v2 = 20;
contohmethod(v1, v2);
int r = 10;
contohmethod(ref r);
Console.ReadLine();
}
}
non static method adalah method yang dapat diakses melalui instance-nya
contoh :
class First
{
public virtual void one()
{
Console.WriteLine(“Class First One”);
}
}
class Second : First
{
public override void one()
{
Console.WriteLine(“Class Second One”);
}
}
class Program
{
static void Main(string[] args)
{
First x = new First() ;
Second y = new Second() ;
x.one();
y.one();
Console.ReadLine();
}
}
Object Oriented Programming using C#
Pengantar OOPAplikasi berbasis windows dan web adalah program yang sangat kompleks yang menyajikan tampilan menarik kepada user dan menawarkan user interface yang kompleks dengan tombol, dropdown, popup menu, toolbox, dan masih banyak komponen yang lain. Dibelakang user interface tersebut masih ada hubungan bussiness prosess yang kompleks seperti misal hubungan antara Product, Customer, dan Order yang melibatkan banyak logika dan pengolahan data.
Untuk menangani berbagai kompleksitas yang terjadi maka programmer mengembangkan teknik yang diberi nama “Objcet Oriented Programming”, dengan tujuan yang sederhana yaitu mengatur kompleksitas dengan memodelkan aspek esensial yang ada. Jika model yang dikembangkan semakin mendekati problem yang akan dipecahkan maka semakin mudah *** persoalan tersebut dapat dimengerti sehingga program lebih mudah ditulis dan di-maintain.
Problem yang akan dipecahkan dan semua informasi yang berhubungan dengan problem tersebut sering disebut sebagai problem domain. Misal jika anda ingin membuat program untuk keperluan Inventory dan Sales di suatu perusahaan maka problem domainnya adalah semua informasi tentang perusahaan tersebut yang berhubungan dengan pengaturan stok inventory, cara penjualan, pemasukan penjualan dan data lainnya. Manaager penjualan dan Manager bagian gudang akan menjadi problem domain expert yang dapat membantu anda dalam menyelesaikan masalah.
Design dari Object Oriented harus berisi objek-objek yang ada pada problem domain tersebut. Sebagai contoh jika problem domainnya adalah mesin ATM maka objek didalamnya seharusnya adalah customer, rekening, dll.
Class vs Object
Apa sich bedanya?. Jika anda ingin membangun rumah Class adalah blueprint / gambar (berisi spesifikasi lengkap dari rumah yang akan dibuat, ukuran, jumlah, dll). Sedangkan object adalah bentuk fisik / rumah yang dibangun berdasarkan blueprint / class yang sudah ada, biasa disebut instan class / object.
Elemen Pada Class
Class pada C# terdiri dari :
· Instance Variable / Field
· Method
Method digunakan untuk merubah state pada field.
Mendefinisikan Class
Class di C# dapat terdiri dari kumpulan variable (field), property dan method. Cara untuk menggunakan class adalah dengan membuat instan class-nya. Untuk menjalankan class maka harus ada satu method main pada class tersebut. contoh pendeklarasian class di C# sebagai berikut:
1: public class Time
2: {
3: // private variables atau field
4: private int year;
5: private int month;
6: private int date;
7: private int hour;
8: private int minute;
9: private int second;
10:
11: // public methods
12: public void DisplayCurrentTime()
13: {
14: Console.WriteLine(“Menampilkan Waktu..”);
15: }
16: }
17:
18: class Program
19: {
20: static void Main(string[] args)
21: {
22: Time timeObject = new Time(); //membuat instan class
23: timeObject.DisplayCurrentTime(); //memanggil method dalam class
24: }
25: }
C# Modifier
C# memiliki beberapa modifier class yaitu:
Access Modifiers
Access Modifiers digunakan untuk menentukan hak akses dari class dan method, adapun access modifier yang ada pada C# sebagai berikut:
Method Arguments
Method pada C# dapat memiliki banyak argumen dengan tipe data yang berbeda. Method juga dapat memiliki nama yang sama asal parameter / tipe datanya berbeda (Method Overloading).
1: class MyClass {
2: public void SomeMethod(int firstParam, double secondParam) {
3: Console.WriteLine(“Parameter 1 : {0} dan parameter 2 : {1}”,
4: firstParam, secondParam);
5: }
6:
7: //overload method
8: public void SomeMethod(int firstParam) {
9: Console.WriteLine(“Parameter 1 : {0}”, firstParam);
10: }
11:
12: public void SomeMethod(int firstParam, string secondParam) {
13: Console.WriteLine(“Parameter 1 : {0} dan parameter 2 : {1}”,
14: firstParam, secondParam);
15: }
16: }
17:
18: class MethodArgumen {
19: static void Main(string[] args) {
20: MyClass m1 = new MyClass(); //membuat instan object
21: m1.SomeMethod(12, 1.25);
22: m1.SomeMethod(34);
23: m1.SomeMethod(12, “Hello”);
24: }
25: }
Konstruktor
Konstruktor adalah method yang namanya sama dengan nama class-nya. Konstruktor digunakan untuk inisialisasi variabel ketika membuat instan class / objek baru. Sebenarnya setiap kali anda membuat instant class / objek baru maka konstruktor dijalankan. Jika anda tidak mendefinisikan konstruktor secara eksplisit maka tetap dianggap membuat konstruktor kosong.
Konstruktor juga dapat di-overload (anda dapat membuat konstruktor lebih dari satu asal parameternya jumlahnya beda atau tipe datanya beda).
Variabel dalam class harus diinisialisasi, nilai defaultnya adalah
1: public class Time {Initializer
2: // private member variables
3: int Year;
4: int Month;
5: int Date;
6: int Hour;
7: int Minute;
8: int Second;
9:
10: // constructor
11: public Time(System.DateTime dt) {
12: Year = dt.Year;
13: Month = dt.Month;
14: Date = dt.Day;
15: Hour = dt.Hour;
16: Minute = dt.Minute;
17: Second = dt.Second;
18: }
19:
20: // public methods
21: public void DisplayCurrentTime() {
22: System.Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”,
23: Month, Date, Year, Hour, Minute, Second);
24: }
25:
26: }
27:
28: class LatKonstruktor {
29: public static void Main(string[] args) {
30: DateTime currTime = DateTime.Now;
31: Time t = new Time(currTime); //memanggil constructor
32: t.DisplayCurrentTime();
33: }
34: }
Pada C# anda bisa menginisialisasi variabel dalam class secara langsung tanpa harus mengisialisasi-nya lewat konstruktor.
1: public class Time“This” Keyword
2: {
3: // private member variables
4: int year;
5: int month;
6: int date;
7: int hour;
8: int minute;
9: int second = 30; //initializer
10: }
This keyword digunakan untuk mengakses instan class / objek itu sendiri, penggunaan keyword this diperlukan untuk membedakan pengaksesan class variabel dan method variabel yang mempunyai nama yang sama.
1: public class Time {
2: // private member variables, class variable
3: int year;
4: int month;
5: int date;
6: int hour;
7: int minute;
8: int second = 30;
9:
10: public void SetTime(year, month, date, newHour, newMinute, newSecond) {
11: this.year = year; // penggunaan “this” dibutuhkan
12: this.month = month; // dibutuhkan
13: this.date = date; // dibutuhkan
14: this.hour = hour; // penggunaan “this” optional
15: this.minute = newMinute; // optional
16: second = newSecond; // optional
17: }
18: }
Static dan Instance Member
Field, property, dan method dalam suatu class bisa merupakan instance member atau static member. Instance member dibentuk ketika class tersebut dibuat instan-nya, secara default field, property, dan method yang tidak diberi keyword static merupakan instance member.
Static member tidak berhubungan dengan instan class melainkan langsung berhubungan dengan class tersebut. Dengan menggunakan keyword static anda dapat mengakses field, property, atau method pada suatu class tanpa harus membuat instan class-nya.
1: public class Kucing {
2: private static int instances = 0;
3: public Kucing() {
4: instances++;
5: }
6: public static void BanyakKucing() {
7: Console.WriteLine(“Banyak Kucing : {0}”, instances);
8: }
9: }
10:
11: class StaticMember {
12: public static void Main(string[] args) {
13: Kucing meong1 = new Kucing();
14: Kucing.BanyakKucing();
15: Kucing meong2 = new Kucing();
16: Kucing meong3 = new Kucing();
17: Kucing.BanyakKucing();
18: }
19: }
Destroy Object
Karena C# menyediakan garbage collector, anda tidak perlu secara eksplisit men-destroy objek. Jika anda bekerja dengan unmanage resource (kode yang tidak di handle oleh CLR) maka anda tetap harus mendestroy objek secara manual. Adapun cara pendeklarasian destruktor pada C# sebagai berikut:
1: ~MyClass( ){Jika anda menggunakan managed code pada C# maka anda tidak diperbolehkan untuk mendestroy object secara langsung karena pada managed code, destroy object sudah diatur oleh komponen garbage collector pada CLR. Untuk men-destroy objek secepat mungkin setelah tidak diperlukan lagi anda dapat menggunakan interface IDisposable.
2: // perintah disini
3: }
1: class Testing : IDisposable {Menggunakan Using Statement
2: bool is_disposed = false;
3: protected virtual void Dispose(bool disposing) {
4: if (!is_disposed) { //hanya sekali dispose
5: if (disposing) {
6: Console.WriteLine(
7: “Sudah di dispose tanpa masuk ke desktruktor”);
8: }
9: //bersihkan objectnya disini
10: Console.WriteLine(“Disposing…”);
11: }
12: this.is_disposed = true;
13: }
14:
15: public void Dispose() {
16: Dispose(true);
17: GC.SuppressFinalize(this);
18: }
19:
20: ~Testing(){
21: Dispose(false);
22: Console.WriteLine(“Didalam destruktor”);
23: }
24: }
25:
26: class LatDispose {
27: public static void Main(string[] args) {
28: Testing t1 = new Testing();
29: t1.Dispose();
30: }
31: }
Untuk memudahkan developer C# menyediakan statement using untuk memastikan bahwa method dispose dijalankan. (kadang kita lupa untuk memanggil method dispose ini). Penggunaan using hanya bisa digunakan untuk class yang mengimplementasikan IDisposable.
1: class LatDispose {Passing Parameter
2: public static void Main(string[] args) {
3: using (Testing t1 = new Testing()) {
4: Console.WriteLine(“Menggunakan Keyword Using..”);
5: }
6: }
7: }
Parameter pada C# secara default yang dikirimkan kedalam method adalah nilainya, atau “pass by value”. Jadi jika ada perubahan nilai parameter pada method tersebut tidak berpengaruh ke method.
1: public class Time {Jika ingin mengirimkan parameter referenced / ‘pass by reference’ anda dapat menambahkan keyword ref sebelum tipe data pada method parameternya.
2: // private member variables
3: private int Year;
4: private int Month;
5: private int Date;
6: private int Hour;
7: private int Minute;
8: private int Second;
9:
10: public void DisplayCurrentTime() {
11: System.Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”,
12: Month, Date, Year, Hour, Minute, Second);
13: }
14:
15: public int GetHour() {
16: return Hour;
17: }
18:
19: public void GetTime(int h, int m, int s) {
20: h = Hour;
21: m = Minute;
22: s = Second;
23: }
24:
25: public Time(System.DateTime dt) { //konstruktor
26: Year = dt.Year;
27: Month = dt.Month;
28: Date = dt.Day;
29: Hour = dt.Hour;
30: Minute = dt.Minute;
31: Second = dt.Second;
32: }
33:
34: class MethodByReference {
35:
36: public static void Main(string[] args) {
37: System.DateTime currentTime = System.DateTime.Now;
38: Time t = new Time(currentTime);
39: t.DisplayCurrentTime();
40:
41: int theHour = 0;
42: int theMinute = 0;
43: int theSecond = 0;
44: t.GetTime(theHour, theMinute, theSecond);
45: System.Console.WriteLine(“Current time: {0}:{1}:{2}”,
46: theHour, theMinute, theSecond);
47: }
48: }
49: }
1: //tambahkan keyword ref pada parameterOverloading Konstruktor & Method
2: public void GetTime(ref int h,ref int m,ref int s) {
3: h = Hour;
4: m = Minute;
5: s = Second;
6: }
7:
8: //pada method main tambahkan ref pada method pemanggil
9: int theHour = 0;
10: int theMinute = 0;
11: int theSecond = 0;
12: t.GetTime(ref theHour, ref theMinute, ref theSecond);
13: System.Console.WriteLine(“Current time: {0}:{1}:{2}”,
14: theHour, theMinute, theSecond);
Pada C# anda dapat mendeklarasikan method atau konstruktor dengan nama yang sama pada sebuah class, tetapi parameter method tersebut harus berbeda bisa jumlah atau tipe datanya. Pada contoh dibawah ini akan ditunjukan bagaimana cara menggunakan overloading konstruktor
1: public class TimeSelain konstruktor overloading juga bisa diterapkan pada method dalam suatu class yang sama, contoh penulisannya:
2: {
3: // private member variables
4: private int Year;
5: private int Month;
6: private int Date;
7: private int Hour;
8: private int Minute;
9: private int Second;
10:
11: // public accessor methods
12: public void DisplayCurrentTime()
13: {
14: System.Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”,
15: Month, Date, Year, Hour, Minute, Second);
16: }
17: // constructors
18: public Time(System.DateTime dt)
19: {
20: Year = dt.Year;
21: Month = dt.Month;
22: Date = dt.Day;
23: Hour = dt.Hour;
24: Minute = dt.Minute;
25: Second = dt.Second;
26: }
27: public Time(string strTime) // overloading konstruktor
28: {
29: Console.WriteLine(strTime);
30: }
31:
32: public Time(int Year, int Month, int Date,
33: int Hour, int Minute, int Second) // overloading konstruktor
34: {
35: this.Year = Year;
36: this.Month = Month;
37: this.Date = Date;
38: this.Hour = Hour;
39: this.Minute = Minute;
40: this.Second = Second;
41: }
42: }
43:
44: class Tester
45: {
46: public void Run()
47: {
48: System.DateTime currentTime = System.DateTime.Now;
49: Time time1 = new Time(currentTime);
50: time1.DisplayCurrentTime();
51: Time time2 = new Time(2000, 11, 18, 11, 03, 30);
52: time2.DisplayCurrentTime();
53: }
54:
55: static void Main()
56: {
57: Tester t = new Tester();
58: t.Run();
59: }
60: }
1: void MyMethod(int p1);
2: void MyMethod(int p1, int p2); // beda banyak parameter
3: void MyMethod(int p1, string s1); // beda tipe data
Enkapsulasi data dengan Property
Enkapsulasi / penyembunyian informasi adalah konsep yang selama ini sering anda dengar. Pada OOP informasi dibungkus dalam sebuah Class sehingga orang yang menggunakan class tersebut tidak perlu tahu detail-nya, hanya cukup mengetahui method dan property apa saja yang ada dalam class tersebut beserta kegunaannya.
Pada pemrograman berorientasi objek variabel dalam class biasanya diberi access modifier private, ini berarti hanya method dalam class tersebut yang dapat mengakses variabelnya. Yang menjadi pertanyaan bagaimana cara anda mengakses variabel bertipe private tersebut? Mengapa harus dibuat private?
Jika anda membuat variable tersebut public maka user yang menggunakan class tersebut bisa memasukan nilai yang tidak kita inginkan, maka anda harus mendeklarasikan variable tersebut secara private agar pada saat setMethod() anda dapat menambahkan validasi inputan dari user.
Anda bisa membuat public method set dan get untuk memberi dan mengambil nilai variabel tersebut, misal:
1: // private member variables
2: private int Year;
3:
4: public int getYear() //get method
5: {
6: return this.Year;
7: }
8:
9: public void setYear(int Year) //set method
10: {
11: this.Year = Year;
12: }
Selain menggunakan cara tersebut diatas pada C# disediakan object property untuk memberi nilai dan mengambil nilai dari private variabel dalam suatu class. Penggunaan object property lebih memudahkan anda dalam penulisan kode dibandingkan harus membuat dua method set dan get untuk mengakses satu variabel private. Contoh penggunaan property dapat dilihat pada contoh kode dibawah ini.
1: class Mahasiswa {Get Accessor
2: private string nim;
3: private string nama;
4:
5: public string Nim {
6: get {
7: return nim;
8: }
9: set {
10: this.nim = value;
11: }
12: }
13:
14: public string Nama {
15: get {
16: return nama;
17: }
18: set {
19: this.nama = value;
20: }
21: }
22:
23: public string DisplayInfo() {
24: return Nim + ” ” + Nama;
25: }
26: }
27:
28: class ClassProperty {
29: public static void Main(string[] args) {
30: Mahasiswa mhs1 = new Mahasiswa();
31: mhs1.Nim = “22002321″;
32: mhs1.Nama = “Erick”;
33: Console.WriteLine(mhs1.DisplayInfo());
34: }
35: }
Penggunakan get{} pada property mirip dengan jika anda menggunaan method getValue() / getter method pada java, get pasti mengembalikan nilai jadi dalam kalang get harus ada return valuenya.
Set Accessor
Penggunaan set{} pada property mirip dengan jika anda menggunakan setValue() / setter method pada java, set digunakan untuk memberi nilai kedalam class variable. Pada C# jika anda memberi nilai pada property maka set{} otomatis dijalankan.
Specialization dan Generalization
Class dan instannya (objek) tidak berdiri sendiri, seperti objek manusia yang merupakan mahluk sosial tidak hanya berdiri sendiri, objek akan saling berelasi dan berinteraksi, demikian *** pada OOP.
Salah satu hubungan antar objek yang paling penting yang terjadi di dunia nyata adalah spesialisasi yang bisa didefinisikan sebagai is-a relationship, misal anjing adalah mamalia, jika anjing termasuk anggota mamalia maka dia memiliki ciri-ciri special khas yaitu menyusui, punya bulu. Selain sifat-sifat pada mamalia anjing juga memiliki ciri yang spesifik khas anjing yang tidak dipunyai anggota mamalia lainnya seperti kucing.
Relasi spesialisasi dan generalisasi terjadi pada contoh diatas, anjing dan kucing secara general merupakan anggota mamalia tetapi juga terspesialisasi secara spesifik sebagai anjing dan kucing yang mempunyai ciri khas yang berbeda. Relasi tersebut dapat digambarkan secara hirarki.
Inheritance
Pada C# hubungan spesialisasi diimplementasikan menggunakan prinsip inheritance. Penulisan inheritance di C# sebagai berikut
public class ListBox : Window
Kode diatas berarti class ListBox adalah turunan dari class Window
Penggunaan inheritance dapat dilihat pada program dibawah ini
1: public class Window {Memanggil Base Class Constructor
2: //variabel dideklarasikan private sehingga tidak bisa diakses oleh kelas
3: //turunannya
4: private int top;
5: private int left;
6:
7: //objek konstruktor
8: public Window(int top, int left) {
9: this.top = top;
10: this.left = left;
11: }
12:
13: public void DrawWindow() {
14: Console.WriteLine(“Draw window pada ({0},{1})”,
15: top, left);
16: }
17: }
18:
19: public class ListBox : Window {
20: //member variable baru pada class anak
21: private string listBoxContent;
22: public ListBox(int top, int left, string contents):base(top,left) {
23: this.listBoxContent = contents;
24: }
25:
26: //versi baru karena override dari base classnya
27: public new void DrawWindow() {
28: base.DrawWindow();
29: Console.WriteLine(“Menuliskan string pada listbox: {0}”,
30: listBoxContent);
31: }
32: }
33:
34: class LatInheritance {
35: public static void Main(string[] args) {
36: Window objWindow = new Window(10, 15);
37: objWindow.DrawWindow();
38:
39: ListBox objList = new ListBox(15, 20, “Hello ListBox”);
40: objList.DrawWindow();
41: }
42: }
Pada contoh diatas class ListBox adalah turunan dari class Window, class ListBox mempunyai konstruktornya sendiri yang memiliki tiga parameter, konstruktor pada class ListBox dapat menggunakan tanda : (titik dua) untuk memanggil kosntruktor base class-nya (konstruktor pada class Window)
public ListBox(int top, int left, string theContents):base(top, left)
Karena konstruktor tidak dapat diturunkan maka class turunan harus memiliki konstruktor sendiri.
Polymorphism
Ada dua aspek yang paling penting pada inheritance yang pertama adalah code reuse, sebagai contoh ketika anda membuat class ListBox maka anda dapat menggunakan logic yang sudah dibuat pada class Window
Aspek kedua yang tidak kalah penting dari inheritance adalah polymorhism, poly berarti banyak dan morph berarti bentuk, jadi polymorphism dapat berarti dapat menggunakan banyak bentuk tanpa harus mengacu details yang sama.
Dari istilahnya Polymorphism kesannya sulit dan kompleks, tetapi sebenarnya simple, ilustrasinya begini ketika sebuah perusahaan telpon / provide telpon mengirimkan signal ke anda (dering telpon), mereka tidak tahu telpon apa yang anda gunakan, bisa model lama dengan dering kuno, bisa HP dengan dering music mp3, TV Phone, PDA Phone dll. yang provider tahu bahwa masing-masing telepon mempunyai ‘base type’ telepon dan mempunyai method untuk berdering. Ketika provider mengirimkan signal mereka hanya berharap bahwa telepon akan berdering tidak peduli jenis telponnya, nah provider telepon memperlakukan telepon anda secara polymorphism.
Membuat Type Polymorphism
Dari gambar diatas dapat anda lihat, ListBox is-a Control (karena ListBox turunan dari Control), Button is-a Control, kita berharap bahwa dapat memperlakukan keduanya sebagai Control. Misal anda mempunyai banyak control di collection untuk digambar ke windows, dan mengharapkan ketika memanggil method draw() pada control maka control2 tersebut akan tergambar sesuai dengan tipe objectnya (mis: ListBox, RadioButton, Command, dll).
Anda dapat mengimplementasikan polymorphism dengan dua cara yaitu:
- Membuat virtual method pada base class (class induk)
- Membuat class turunan yang mempunyai method dengan keyword override yang mengganti isi dari method dengan keyword virtual yang ada pada base class-nya.
1: public class Control {Dapat dilihat dari contoh diatas bahwa base class yaitu Window mempunyai method yang bernama DrawWindow() yang mempunyai keyword virtual, ini berarti method tersebut dapat di override atau diganti implementasinya dengan method yang nama dan parameternya sama persis di kelas turunannya yaitu class ListBox.
2: //variabel dideklarasikan private sehingga tidak bisa diakses oleh kelas
3: //turunannya
4: private int top;
5: private int left;
6:
7: protected int Top {
8: get {
9: return this.top;
10: }
11: set {
12: this.top = value;
13: }
14: }
15:
16: protected int Left {
17: get {
18: return this.left;
19: }
20: set {
21: this.left = value;
22: }
23: }
24:
25: //objek konstruktor
26: public Control(int top, int left) {
27: Top = top;
28: Left = left;
29: }
30:
31: public virtual void DrawWindow() {
32: Console.WriteLine(“Draw window pada ({0},{1})”,
33: top, left);
34: }
35:
36: }
37:
38: public class ListBox : Control {
39: //member variable baru pada class anak
40: private string listBoxContent;
41: public ListBox(int top, int left, string contents)
42: : base(top, left) {
43: this.listBoxContent = contents;
44: }
45:
46: //versi baru karena override dari base classnya
47: public override void DrawWindow() {
48: base.DrawWindow();
49: Console.WriteLine(“Menuliskan string pada listbox: {0}”,
50: listBoxContent);
51: }
52:
53: }
54:
55: public class Button : Control {
56: public Button(int top, int left) : base(top, left) {}
57:
58: public override void DrawWindow() {
59: //base.DrawWindow();
60: Console.WriteLine(“Menggambar button pada ({0},{1})”, Top, Left);
61: }
62: }
63: class LatPolymophism {
64: static void Main(string[] args) {
65: Control win = new Control(10, 15);
66: ListBox lstBox = new ListBox(5, 10, “Text pada ListBox”);
67: Button b = new Button(5, 6);
68: win.DrawWindow();
69: lstBox.DrawWindow();
70: b.DrawWindow();
71:
72: Control[] winArray = new Control[3];
73: winArray[0] = new Control(10, 15);
74: winArray[1] = new ListBox(5, 10, “Pada ListBox”);
75: winArray[2] = new Button(5, 6);
76:
77: for (int i = 0; i < 3; i++) {
78: winArray.DrawWindow();
79: }
80: }
81: }
Versioning dengan new dan override keyword
Pada contoh diatas digunakan keyword virtual pada base class agar dapat dioverride oleh class turunannya. Akan timbul masalah jika misal: Perusahan A membuat class Control kemudian perusahaan B membelinya untuk membuat ListBox dan RadioButton (tapi B tidak bisa memodifikasi class Control karena hanya beli tanpa code), pada saat membuat ListBox perusahaan B menambahkan fungsi sort() kedalam class tersebut
1: public class ListBox : ControlHal diatas tidak menjadi masalah sampai perusahaan A menambahkan method sort() juga dalam class Control:
2: {
3: public virtual void Sort( ) {…}
4: }
1: public class ControlMaka akan menjadi rancu karena ada dua method dengan nama yang sama ketika anda akan memanggil method sort dari class turunan ListBox, tidak bisa dibedakan mana method sor() pada Control atau ListBox, untuk menangani masalah ini C# menyediakan keyword new.
2: {
3: // …
4: public virtual void Sort( ) {…}
5: }
1: public class ListBox : ControlAbstract Class
2: {
3: public new virtual void Sort( ) {…}
4: }
Setiap tipe Window pasti mempunyai bentuk tampilan yang berbeda misal combobox, listbox, button, dll. Berarti setiap class turunan dari Window harus mempunyai method DrawWindow() nya sendiri yang berbeda satu sama lain. Untuk memastikan bahwa setiap class turunan Control harus mempunyai method DrawWindow() maka anda harus mendefinisikan class tersebut sebagai abstract class dan memiliki method abstract yang belum diimplementasikan.
Abstract method tidak mempunyai implementation, abstract method hanya semacam kontrak yang harus dipenuhi. Semua class yang diturunkan dari class yang mempunyai abstract method harus mengimplementasikan method tersebut.
Class yang didefinisikan sebagai abstract class tidak dapat dibuat instan class / objek, class yang didefinisikan abstract hanya dapat digunakan dengan cara diturunkan.
1: public abstract class Control {Tapi untuk kasus diatas abstract masih mempunyai keterbatasan, jika anda ingin membuat class DropDownList yang hendak diturunkan dari class ListBox, maka anda tidak dapat memaksakan method DrawWindow() harus ada di class tersebut.
2: private int top;
3: private int left;
4:
5: protected int Top {
6: get { return this.top;}
7: set { this.top = value;}
8: }
9: protected int Left {
10: get {return this.left;}
11: set {this.left = value;}
12: }
13: public Control(int top, int left) {
14: Top = top;
15: Left = left;
16: }
17: //abstract method harus diimplementasikan
18: public abstract void DrawWindow();
19: }
20:
21: public class ListBox : Control {
22: private string listBoxContent;
23: public ListBox(int top, int left, string contents)
24: : base(top, left) {
25: this.listBoxContent = contents;
26: }
27:
28: public override void DrawWindow() {
29: Console.WriteLine(“Position {0},{1})”, Top, Left);
30: Console.WriteLine(“Menuliskan string pada listbox: {0}”,
31: listBoxContent);
32: }
33:
34: }
35:
36: public class Button : Control {
37: public Button(int top, int left) : base(top, left) { }
38: public override void DrawWindow() {
39: Console.WriteLine(“Menggambar button pada ({0},{1})”, Top, Left);
40: }
41: }
42: class LatAbstract {
43: static void Main(string[] args) {
44: Control[] winArray = new Control[3];
45: winArray[0] = new ListBox(5, 10, “Pada ListBox”);
46: winArray[1] = new Button(5, 6);
47: for (int i = 0; i < 2; i++) {
48: winArray.DrawWindow();
49: }
50: }
51: }
Sealed Class
Jika anda ingin membuat class yang tidak dapat diturunkan lagi maka anda dapat menambahkan keyword ‘sealed’.
Object Root dari semua class
Semua class dari semua type diturunkan dari satu class untama yaitu class object. Meskipun tidak dituliskan secara eksplisit namun pada dasarnya semua class diturunkan dari class object.
Beberapa method yang ada pada class object adalah: Equals(), GetHashCode(), GetType(), ToString(), Finalize(), MemberwiseClone(), ReferenceEquals().
Method dari class yang ada diatas dapat dioverride oleh semua class karena pada dasarnya semua class diturunkan dari class object.
1: public class Cat {Boxing dan Unboxing Types
2: private int weight;
3: public Cat(int weight) {
4: this.weight = weight;
5: }
6:
7: public override string ToString() {
8: return weight.ToString();
9: }
10: }
11: class LatObject {
12: static void Main(string[] args) {
13: Cat catty = new Cat(60);
14: Console.WriteLine(“Berat si catty : ” + catty);
15: }
16: }
Boxing dan Unboxing adalah suatu proses ketika suatu tipe data value (seperti int) di konversikan menjadi tipe reference / object. Istilah boxing berarti diubah menjadi object dan unboxing berarti dikembalikan lagi ke tipe data value.
Proses boxing dilakukan secara implisit jadi compiler otomatis akan melakukannya ketika kita mengisi nilai bertipe value kedalam variabel bertipe object.
1: int myIntegerValue = 5;
2: object myObject = myIntegerValue; // cast to an object
3: myObject.ToString();
Tidak seperti boxing, proses unboxing harus eksplisit. Ketika proses unbox kita harus tahu tipe data apa yang kita ingin konversikan dari tipe objek-nya.
1: int myInt = 123;
2: //proses boxing (dilakukan secara otomatis)
3: object objInt = myInt;
4: Console.WriteLine(“Nilai ObjInt : {0}”,objInt.ToString());
5:
6: //proses unboxing (harus dilakukan secara eksplisit)
7: myInt = (int)objInt;
8: Console.WriteLine(“Nilai myInt : {0}”, myInt.ToString());
Menghindari Boxing dan unboxing dengan Generic
Proses boxing dan unboxing mempengaruhi performa program, karena semua harus di boxing kedalam tipe object (misal: dalam penggunaan ArrayList). Pada C# 2.0 keatas sudah mendukung generic sehingga proses boxing dan unboxing dapat dihindari.
Interfaces
Jika anda ingin mendefinisikan tipe baru tetapi tidak ingin mengimplementasikan isinya secara langsung maka anda dapat menggunakan interfaces.
Pada dasarnya interface adalah sebuah kontrak, ketika anda mendesign interface seolah-olah anda mengatakan “jika anda ingin menggunakan class ini maka anda harus mengimplementasikan method, property yang sudah disediakan”. Class yang menggunakan interface tersebut setuju dengan kontrak dan mengimplementasikan requirement yang ditentukan.
Dibandingkan dengan abstract class, abstract class hanya bisa digunakan di class paling atas ‘top-hierarchy’ sedangkan interface dapat digunakan di setiap class yang diinginkan (setiap class dapat mengimplementasikan lebih dari satu interface).
Perbedaan Interface dan Abstract Class
Programmer sering merasa bingung dalam mebedakan Interface dan Abstract Class. Beberapa perbedaannya adalah:
- Cara penggunaan Abstract Class adalah diturunkan, sedangkan cara penggunaan Interface adalah diimplementasikan.
- Pada C# lambang untuk menurunkan class dan menggunakan interfaces sama-sama menggunakan tanda “:” (titik dua). Tetapi untuk membedakan biasanya nama interface diawali dengan huruf I di depan misal: IEnumerable, IDisposable, dll.
- Sebuah class hanya dapat diturunkan dari satu abstract class tapi dapat menggunakan lebih dari satu interfaces.
- Method dan member variable pada abstract class boleh sudah ada isinya, sedangkan pada interfaces semua belum ada implementasinya.
- Pada Abstract Class semua method / member variable yang abstract harus diimplementasikan di class turunannya.
- Pada Interface semua member variable dan method harus diimplementasikan di class yang menggunakan interface tersebut.
- Access Modifier pada method dan member variable di Interface secara implisit adalah public.
1: interface IStorable {Mengimplementasikan lebih dari satu Interface
2: void Read();
3: void Write();
4: int Status { get; set; }
5: }
6:
7: public class Document : IStorable {
8: private int status = 0;
9:
10: public Document(string s) {
11: Console.WriteLine(“Create : {0}”, s);
12: }
13:
14: public void Read() {
15: Console.WriteLine(“Mengimplementasikan method Read dari IStorable”);
16: }
17:
18: public void Write() {
19: Console.WriteLine(“Mengimplementasikan method Write dari IStorable”);
20: }
21:
22: public int Status {
23: get { return this.status; }
24: set { this.status = value; }
25: }
26: }
27:
28: class LatSimpleInterface {
29: static void Main(string[] args) {
30: Document doc = new Document(“New Document”);
31: doc.Read();
32: doc.Write();
33: doc.Status = 1;
34: Console.WriteLine(“Document status : {0}”, doc.Status);
35: }
36: }
Pada C# sebuah class hanya dapat diturunkan dari sebuah class saja, tidak seperti bahasa C++ yang mendukung multipe inheritance. Tetapi untuk interface anda dapat menggunakan lebih dari satu interface dalam sebuah class.
Misal saja untuk class dokumen diatas dapat disimpan dan dapat juga dikompres datanya, maka anda dapat menambahkan interface Icompressible kedalam class tersebut.
Interface juga dapat dikombinasikan, anda bisa menambahkan inteface kedalam interface lain, misal:
1: interface ICompessible {Ketika anda menggunakan interface IloggedCompresible maka anda harus mengimplementasikan method Compress(), Decompress(), dan LogSavedBytes().
2: void Compress();
3: void Decompress();
4: }
5: interface ILoggedCompresible : ICompessible {
6: void LogSavedBytes();
7: }
1: interface IStorable {Delegates dan Event
2: void Read();
3: void Write(object obj);
4: int Status { get; set; }
5: }
6:
7: interface ICompressible {
8: void Compress();
9: void Decompress();
10: }
11:
12: interface ILoggedCompressible : ICompressible {
13: void LogSavedBytes();
14: }
15:
16: interface IStorableCompressible : IStorable, ILoggedCompressible{
17: void LogOriginalSize();
18: }
19:
20: interface IEncryptable {
21: void Encrypt();
22: void Decrypt();
23: }
24:
25: public class Document : IStorableCompressible, IEncryptable {
26: private int status = 0;
27:
28: public Document(string s) {
29: Console.WriteLine(“Creating Document: {0}”, s);
30: }
31:
32: public void LogOriginalSize() {
33: Console.WriteLine(“Mengimplementasikan method LogOriginalSize”);
34: }
35:
36: public void Read() {
37: Console.WriteLine(“Mengimplementasikan method Read”);
38: }
39:
40: public void Write(object obj) {
41: Console.WriteLine(“Mengimplementasikan method Write”);
42: }
43:
44: public int Status {
45: get { return status; }
46: set { this.status = value; }
47: }
48:
49: public void LogSavedBytes() {
50: Console.WriteLine(“Mengimplementasikan method LogSavedBytes”);
51: }
52:
53: public void Compress() {
54: Console.WriteLine(“Mengimplementasikan method Compress”);
55: }
56:
57: public void Decompress() {
58: Console.WriteLine(“Mengimplementasikan method Decompress”);
59: }
60:
61: public void Encrypt() {
62: Console.WriteLine(“Mengimplementasilan method Encrypt”);
63: }
64:
65: public void Decrypt() {
66: Console.WriteLine(“Mengimplementasikan method Decrypt”);
67: }
68: }
69:
70: class LatMultipleInterface {
71: static void Main(string[] args) {
72: Document doc = new Document(“New Document”);
73: doc.Read();
74: doc.Compress();
75: doc.LogSavedBytes();
76: doc.LogOriginalSize();
77: doc.Encrypt();
78: doc.Decrypt();
79: doc.Decompress();
80: doc.Status = 1;
81: Console.WriteLine(“Status {0}”, doc.Status);
82: }
83: }
Mungkin anda pernah menjumpai situasi dimana anda ingin mengeksekusi suatu action tetapi anda belum tahu pasti isi dari detail methodnya atau bahkan tidak tahu objectnya. Misal method untuk menghandle button press (ketika object button tersebut ditekan). Anda harus membayangkan bahwa pembuat komponen button, textbox, listbox bukanlah programmer yang menggunakan object tersebut. Pembuat button hanya tahu bahwa button tersebut mempunyai event click (ketika diklik) tapi pembuat buton tidak tahu apa yang terjadi ketika button tersebut diklik (hanya diketahui oleh programmer yang menggunakan button tersebut).
Untuk mengatasi masalah diatas pembuat button sudah menyediakan event misal click, mouse_mive, dll. jika programmer hendak menggunakannya maka dapat mengaksesnya menggunakan delegates. Delegates adalah semacam kontrak yang harus dipenuhi ketika hendak menggunakan method tertentu (mirip dengan interfaces).
1: delegate void StringProcesssor(string input);
2: class Person {
3: private string name;
4:
5: public Person(string name) {
6: this.name = name;
7: }
8:
9: public void Say(string message) {
10: Console.WriteLine(“{0} says : {1}”, name, message);
11: }
12: }
13:
14: class Background {
15: public static void Note(string note) {
16: Console.WriteLine(“({0}) “, note);
17: }
18: }
19:
20: class LatSimpleDelegates {
21: static void Main(string[] args) {
22: Person rick = new Person(“Erick”);
23: Person jhon = new Person(“Jhon”);
24: StringProcesssor jonsVoice, rickVoice, background;
25: rickVoice = new StringProcesssor(rick.Say);
26: jonsVoice = new StringProcesssor(jhon.Say);
27: background = new StringProcesssor(Background.Note);
28:
29: rickVoice(“Hello Jhon !!”);
30: jonsVoice(“Hello rick !!”);
31: background(“Suara ramai lalu lintas”);
32: }
33: }
Object Oriented Programming using C#
Pengantar OOPAplikasi berbasis windows dan web adalah program yang sangat kompleks yang menyajikan tampilan menarik kepada user dan menawarkan user interface yang kompleks dengan tombol, dropdown, popup menu, toolbox, dan masih banyak komponen yang lain. Dibelakang user interface tersebut masih ada hubungan bussiness prosess yang kompleks seperti misal hubungan antara Product, Customer, dan Order yang melibatkan banyak logika dan pengolahan data.
Untuk menangani berbagai kompleksitas yang terjadi maka programmer mengembangkan teknik yang diberi nama “Objcet Oriented Programming”, dengan tujuan yang sederhana yaitu mengatur kompleksitas dengan memodelkan aspek esensial yang ada. Jika model yang dikembangkan semakin mendekati problem yang akan dipecahkan maka semakin mudah *** persoalan tersebut dapat dimengerti sehingga program lebih mudah ditulis dan di-maintain.
Problem yang akan dipecahkan dan semua informasi yang berhubungan dengan problem tersebut sering disebut sebagai problem domain. Misal jika anda ingin membuat program untuk keperluan Inventory dan Sales di suatu perusahaan maka problem domainnya adalah semua informasi tentang perusahaan tersebut yang berhubungan dengan pengaturan stok inventory, cara penjualan, pemasukan penjualan dan data lainnya. Manaager penjualan dan Manager bagian gudang akan menjadi problem domain expert yang dapat membantu anda dalam menyelesaikan masalah.
Design dari Object Oriented harus berisi objek-objek yang ada pada problem domain tersebut. Sebagai contoh jika problem domainnya adalah mesin ATM maka objek didalamnya seharusnya adalah customer, rekening, dll.
Class vs Object
Apa sich bedanya?. Jika anda ingin membangun rumah Class adalah blueprint / gambar (berisi spesifikasi lengkap dari rumah yang akan dibuat, ukuran, jumlah, dll). Sedangkan object adalah bentuk fisik / rumah yang dibangun berdasarkan blueprint / class yang sudah ada, biasa disebut instan class / object.
Elemen Pada Class
Class pada C# terdiri dari :
· Instance Variable / Field
· Method
Method digunakan untuk merubah state pada field.
Mendefinisikan Class
Class di C# dapat terdiri dari kumpulan variable (field), property dan method. Cara untuk menggunakan class adalah dengan membuat instan class-nya. Untuk menjalankan class maka harus ada satu method main pada class tersebut. contoh pendeklarasian class di C# sebagai berikut:
1: public class TimeC# Modifier
2: {
3: // private variables atau field
4: private int year;
5: private int month;
6: private int date;
7: private int hour;
8: private int minute;
9: private int second;
10:
11: // public methods
12: public void DisplayCurrentTime()
13: {
14: Console.WriteLine(“Menampilkan Waktu..”);
15: }
16: }
17:
18: class Program
19: {
20: static void Main(string[] args)
21: {
22: Time timeObject = new Time(); //membuat instan class
23: timeObject.DisplayCurrentTime(); //memanggil method dalam class
24: }
25: }
C# memiliki beberapa modifier class yaitu:
Access Modifiers
Access Modifiers digunakan untuk menentukan hak akses dari class dan method, adapun access modifier yang ada pada C# sebagai berikut:
Method Arguments
Method pada C# dapat memiliki banyak argumen dengan tipe data yang berbeda. Method juga dapat memiliki nama yang sama asal parameter / tipe datanya berbeda (Method Overloading).
1: class MyClass {Konstruktor
2: public void SomeMethod(int firstParam, double secondParam) {
3: Console.WriteLine(“Parameter 1 : {0} dan parameter 2 : {1}”,
4: firstParam, secondParam);
5: }
6:
7: //overload method
8: public void SomeMethod(int firstParam) {
9: Console.WriteLine(“Parameter 1 : {0}”, firstParam);
10: }
11:
12: public void SomeMethod(int firstParam, string secondParam) {
13: Console.WriteLine(“Parameter 1 : {0} dan parameter 2 : {1}”,
14: firstParam, secondParam);
15: }
16: }
17:
18: class MethodArgumen {
19: static void Main(string[] args) {
20: MyClass m1 = new MyClass(); //membuat instan object
21: m1.SomeMethod(12, 1.25);
22: m1.SomeMethod(34);
23: m1.SomeMethod(12, “Hello”);
24: }
25: }
Konstruktor adalah method yang namanya sama dengan nama class-nya. Konstruktor digunakan untuk inisialisasi variabel ketika membuat instan class / objek baru. Sebenarnya setiap kali anda membuat instant class / objek baru maka konstruktor dijalankan. Jika anda tidak mendefinisikan konstruktor secara eksplisit maka tetap dianggap membuat konstruktor kosong.
Konstruktor juga dapat di-overload (anda dapat membuat konstruktor lebih dari satu asal parameternya jumlahnya beda atau tipe datanya beda). Variabel dalam class harus diinisialisasi, nilai defaultnya adalah
1: public class Time {Initializer
2: // private member variables
3: int Year;
4: int Month;
5: int Date;
6: int Hour;
7: int Minute;
8: int Second;
9:
10: // constructor
11: public Time(System.DateTime dt) {
12: Year = dt.Year;
13: Month = dt.Month;
14: Date = dt.Day;
15: Hour = dt.Hour;
16: Minute = dt.Minute;
17: Second = dt.Second;
18: }
19:
20: // public methods
21: public void DisplayCurrentTime() {
22: System.Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”,
23: Month, Date, Year, Hour, Minute, Second);
24: }
25:
26: }
27:
28: class LatKonstruktor {
29: public static void Main(string[] args) {
30: DateTime currTime = DateTime.Now;
31: Time t = new Time(currTime); //memanggil constructor
32: t.DisplayCurrentTime();
33: }
34: }
Pada C# anda bisa menginisialisasi variabel dalam class secara langsung tanpa harus mengisialisasi-nya lewat konstruktor.
1: public class Time“This” Keyword
2: {
3: // private member variables
4: int year;
5: int month;
6: int date;
7: int hour;
8: int minute;
9: int second = 30; //initializer
10: }
This keyword digunakan untuk mengakses instan class / objek itu sendiri, penggunaan keyword this diperlukan untuk membedakan pengaksesan class variabel dan method variabel yang mempunyai nama yang sama.
1: public class Time {
2: // private member variables, class variable
3: int year;
4: int month;
5: int date;
6: int hour;
7: int minute;
8: int second = 30;
9:
10: public void SetTime(year, month, date, newHour, newMinute, newSecond) {
11: this.year = year; // penggunaan “this” dibutuhkan
12: this.month = month; // dibutuhkan
13: this.date = date; // dibutuhkan
14: this.hour = hour; // penggunaan “this” optional
15: this.minute = newMinute; // optional
16: second = newSecond; // optional
17: }
18: }
Static dan Instance Member
Field, property, dan method dalam suatu class bisa merupakan instance member atau static member. Instance member dibentuk ketika class tersebut dibuat instan-nya, secara default field, property, dan method yang tidak diberi keyword static merupakan instance member.
Static member tidak berhubungan dengan instan class melainkan langsung berhubungan dengan class tersebut. Dengan menggunakan keyword static anda dapat mengakses field, property, atau method pada suatu class tanpa harus membuat instan class-nya.
1: public class Kucing {
2: private static int instances = 0;
3: public Kucing() {
4: instances++;
5: }
6: public static void BanyakKucing() {
7: Console.WriteLine(“Banyak Kucing : {0}”, instances);
8: }
9: }
10:
11: class StaticMember {
12: public static void Main(string[] args) {
13: Kucing meong1 = new Kucing();
14: Kucing.BanyakKucing();
15: Kucing meong2 = new Kucing();
16: Kucing meong3 = new Kucing();
17: Kucing.BanyakKucing();
18: }
19: }
Destroy Object
Karena C# menyediakan garbage collector, anda tidak perlu secara eksplisit men-destroy objek. Jika anda bekerja dengan unmanage resource (kode yang tidak di handle oleh CLR) maka anda tetap harus mendestroy objek secara manual. Adapun cara pendeklarasian destruktor pada C# sebagai berikut:
1: ~MyClass( ){
2: // perintah disini
3: }
Jika anda menggunakan managed code pada C# maka anda tidak diperbolehkan untuk mendestroy object secara langsung karena pada managed code, destroy object sudah diatur oleh komponen garbage collector pada CLR. Untuk men-destroy objek secepat mungkin setelah tidak diperlukan lagi anda dapat menggunakan interface IDisposable.
1: class Testing : IDisposable {Menggunakan Using Statement
2: bool is_disposed = false;
3: protected virtual void Dispose(bool disposing) {
4: if (!is_disposed) { //hanya sekali dispose
5: if (disposing) {
6: Console.WriteLine(
7: “Sudah di dispose tanpa masuk ke desktruktor”);
8: }
9: //bersihkan objectnya disini
10: Console.WriteLine(“Disposing…”);
11: }
12: this.is_disposed = true;
13: }
14:
15: public void Dispose() {
16: Dispose(true);
17: GC.SuppressFinalize(this);
18: }
19:
20: ~Testing(){
21: Dispose(false);
22: Console.WriteLine(“Didalam destruktor”);
23: }
24: }
25:
26: class LatDispose {
27: public static void Main(string[] args) {
28: Testing t1 = new Testing();
29: t1.Dispose();
30: }
31: }
Untuk memudahkan developer C# menyediakan statement using untuk memastikan bahwa method dispose dijalankan. (kadang kita lupa untuk memanggil method dispose ini). Penggunaan using hanya bisa digunakan untuk class yang mengimplementasikan IDisposable.
1: class LatDispose {Passing Parameter
2: public static void Main(string[] args) {
3: using (Testing t1 = new Testing()) {
4: Console.WriteLine(“Menggunakan Keyword Using..”);
5: }
6: }
7: }
Parameter pada C# secara default yang dikirimkan kedalam method adalah nilainya, atau “pass by value”. Jadi jika ada perubahan nilai parameter pada method tersebut tidak berpengaruh ke method.
1: public class Time {Jika ingin mengirimkan parameter referenced / ‘pass by reference’ anda dapat menambahkan keyword ref sebelum tipe data pada method parameternya.
2: // private member variables
3: private int Year;
4: private int Month;
5: private int Date;
6: private int Hour;
7: private int Minute;
8: private int Second;
9:
10: public void DisplayCurrentTime() {
11: System.Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”,
12: Month, Date, Year, Hour, Minute, Second);
13: }
14:
15: public int GetHour() {
16: return Hour;
17: }
18:
19: public void GetTime(int h, int m, int s) {
20: h = Hour;
21: m = Minute;
22: s = Second;
23: }
24:
25: public Time(System.DateTime dt) { //konstruktor
26: Year = dt.Year;
27: Month = dt.Month;
28: Date = dt.Day;
29: Hour = dt.Hour;
30: Minute = dt.Minute;
31: Second = dt.Second;
32: }
33:
34: class MethodByReference {
35:
36: public static void Main(string[] args) {
37: System.DateTime currentTime = System.DateTime.Now;
38: Time t = new Time(currentTime);
39: t.DisplayCurrentTime();
40:
41: int theHour = 0;
42: int theMinute = 0;
43: int theSecond = 0;
44: t.GetTime(theHour, theMinute, theSecond);
45: System.Console.WriteLine(“Current time: {0}:{1}:{2}”,
46: theHour, theMinute, theSecond);
47: }
48: }
49: }
1: //tambahkan keyword ref pada parameterOverloading Konstruktor & Method
2: public void GetTime(ref int h,ref int m,ref int s) {
3: h = Hour;
4: m = Minute;
5: s = Second;
6: }
7:
8: //pada method main tambahkan ref pada method pemanggil
9: int theHour = 0;
10: int theMinute = 0;
11: int theSecond = 0;
12: t.GetTime(ref theHour, ref theMinute, ref theSecond);
13: System.Console.WriteLine(“Current time: {0}:{1}:{2}”,
14: theHour, theMinute, theSecond);
Pada C# anda dapat mendeklarasikan method atau konstruktor dengan nama yang sama pada sebuah class, tetapi parameter method tersebut harus berbeda bisa jumlah atau tipe datanya. Pada contoh dibawah ini akan ditunjukan bagaimana cara menggunakan overloading konstruktor
1: public class TimeSelain konstruktor overloading juga bisa diterapkan pada method dalam suatu class yang sama, contoh penulisannya:
2: {
3: // private member variables
4: private int Year;
5: private int Month;
6: private int Date;
7: private int Hour;
8: private int Minute;
9: private int Second;
10:
11: // public accessor methods
12: public void DisplayCurrentTime()
13: {
14: System.Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”,
15: Month, Date, Year, Hour, Minute, Second);
16: }
17: // constructors
18: public Time(System.DateTime dt)
19: {
20: Year = dt.Year;
21: Month = dt.Month;
22: Date = dt.Day;
23: Hour = dt.Hour;
24: Minute = dt.Minute;
25: Second = dt.Second;
26: }
27: public Time(string strTime) // overloading konstruktor
28: {
29: Console.WriteLine(strTime);
30: }
31:
32: public Time(int Year, int Month, int Date,
33: int Hour, int Minute, int Second) // overloading konstruktor
34: {
35: this.Year = Year;
36: this.Month = Month;
37: this.Date = Date;
38: this.Hour = Hour;
39: this.Minute = Minute;
40: this.Second = Second;
41: }
42: }
43:
44: class Tester
45: {
46: public void Run()
47: {
48: System.DateTime currentTime = System.DateTime.Now;
49: Time time1 = new Time(currentTime);
50: time1.DisplayCurrentTime();
51: Time time2 = new Time(2000, 11, 18, 11, 03, 30);
52: time2.DisplayCurrentTime();
53: }
54:
55: static void Main()
56: {
57: Tester t = new Tester();
58: t.Run();
59: }
60: }
1: void MyMethod(int p1);
2: void MyMethod(int p1, int p2); // beda banyak parameter
3: void MyMethod(int p1, string s1); // beda tipe data
Enkapsulasi data dengan Property
Enkapsulasi / penyembunyian informasi adalah konsep yang selama ini sering anda dengar. Pada OOP informasi dibungkus dalam sebuah Class sehingga orang yang menggunakan class tersebut tidak perlu tahu detail-nya, hanya cukup mengetahui method dan property apa saja yang ada dalam class tersebut beserta kegunaannya.
Pada pemrograman berorientasi objek variabel dalam class biasanya diberi access modifier private, ini berarti hanya method dalam class tersebut yang dapat mengakses variabelnya. Yang menjadi pertanyaan bagaimana cara anda mengakses variabel bertipe private tersebut? Mengapa harus dibuat private?
Jika anda membuat variable tersebut public maka user yang menggunakan class tersebut bisa memasukan nilai yang tidak kita inginkan, maka anda harus mendeklarasikan variable tersebut secara private agar pada saat setMethod() anda dapat menambahkan validasi inputan dari user.
Anda bisa membuat public method set dan get untuk memberi dan mengambil nilai variabel tersebut, misal:
1: // private member variables
2: private int Year;
3:
4: public int getYear() //get method
5: {
6: return this.Year;
7: }
8:
9: public void setYear(int Year) //set method
10: {
11: this.Year = Year;
12: }
Selain menggunakan cara tersebut diatas pada C# disediakan object property untuk memberi nilai dan mengambil nilai dari private variabel dalam suatu class. Penggunaan object property lebih memudahkan anda dalam penulisan kode dibandingkan harus membuat dua method set dan get untuk mengakses satu variabel private. Contoh penggunaan property dapat dilihat pada contoh kode dibawah ini.
1: class Mahasiswa {Get Accessor
2: private string nim;
3: private string nama;
4:
5: public string Nim {
6: get {
7: return nim;
8: }
9: set {
10: this.nim = value;
11: }
12: }
13:
14: public string Nama {
15: get {
16: return nama;
17: }
18: set {
19: this.nama = value;
20: }
21: }
22:
23: public string DisplayInfo() {
24: return Nim + ” ” + Nama;
25: }
26: }
27:
28: class ClassProperty {
29: public static void Main(string[] args) {
30: Mahasiswa mhs1 = new Mahasiswa();
31: mhs1.Nim = “22002321″;
32: mhs1.Nama = “Erick”;
33: Console.WriteLine(mhs1.DisplayInfo());
34: }
35: }
Penggunakan get{} pada property mirip dengan jika anda menggunaan method getValue() / getter method pada java, get pasti mengembalikan nilai jadi dalam kalang get harus ada return valuenya.
Set Accessor
Penggunaan set{} pada property mirip dengan jika anda menggunakan setValue() / setter method pada java, set digunakan untuk memberi nilai kedalam class variable. Pada C# jika anda memberi nilai pada property maka set{} otomatis dijalankan.
Specialization dan Generalization
Class dan instannya (objek) tidak berdiri sendiri, seperti objek manusia yang merupakan mahluk sosial tidak hanya berdiri sendiri, objek akan saling berelasi dan berinteraksi, demikian *** pada OOP.
Salah satu hubungan antar objek yang paling penting yang terjadi di dunia nyata adalah spesialisasi yang bisa didefinisikan sebagai is-a relationship, misal anjing adalah mamalia, jika anjing termasuk anggota mamalia maka dia memiliki ciri-ciri special khas yaitu menyusui, punya bulu. Selain sifat-sifat pada mamalia anjing juga memiliki ciri yang spesifik khas anjing yang tidak dipunyai anggota mamalia lainnya seperti kucing.
Relasi spesialisasi dan generalisasi terjadi pada contoh diatas, anjing dan kucing secara general merupakan anggota mamalia tetapi juga terspesialisasi secara spesifik sebagai anjing dan kucing yang mempunyai ciri khas yang berbeda. Relasi tersebut dapat digambarkan secara hirarki.
Inheritance
Pada C# hubungan spesialisasi diimplementasikan menggunakan prinsip inheritance. Penulisan inheritance di C# sebagai berikut
public class ListBox : Window
Kode diatas berarti class ListBox adalah turunan dari class Window
Penggunaan inheritance dapat dilihat pada program dibawah ini
1: public class Window {Memanggil Base Class Constructor
2: //variabel dideklarasikan private sehingga tidak bisa diakses oleh kelas
3: //turunannya
4: private int top;
5: private int left;
6:
7: //objek konstruktor
8: public Window(int top, int left) {
9: this.top = top;
10: this.left = left;
11: }
12:
13: public void DrawWindow() {
14: Console.WriteLine(“Draw window pada ({0},{1})”,
15: top, left);
16: }
17: }
18:
19: public class ListBox : Window {
20: //member variable baru pada class anak
21: private string listBoxContent;
22: public ListBox(int top, int left, string contents):base(top,left) {
23: this.listBoxContent = contents;
24: }
25:
26: //versi baru karena override dari base classnya
27: public new void DrawWindow() {
28: base.DrawWindow();
29: Console.WriteLine(“Menuliskan string pada listbox: {0}”,
30: listBoxContent);
31: }
32: }
33:
34: class LatInheritance {
35: public static void Main(string[] args) {
36: Window objWindow = new Window(10, 15);
37: objWindow.DrawWindow();
38:
39: ListBox objList = new ListBox(15, 20, “Hello ListBox”);
40: objList.DrawWindow();
41: }
42: }
Pada contoh diatas class ListBox adalah turunan dari class Window, class ListBox mempunyai konstruktornya sendiri yang memiliki tiga parameter, konstruktor pada class ListBox dapat menggunakan tanda : (titik dua) untuk memanggil kosntruktor base class-nya (konstruktor pada class Window)
public ListBox(int top, int left, string theContents):base(top, left)
Karena konstruktor tidak dapat diturunkan maka class turunan harus memiliki konstruktor sendiri.
Polymorphism
Ada dua aspek yang paling penting pada inheritance yang pertama adalah code reuse, sebagai contoh ketika anda membuat class ListBox maka anda dapat menggunakan logic yang sudah dibuat pada class Window
Aspek kedua yang tidak kalah penting dari inheritance adalah polymorhism, poly berarti banyak dan morph berarti bentuk, jadi polymorphism dapat berarti dapat menggunakan banyak bentuk tanpa harus mengacu details yang sama.
Dari istilahnya Polymorphism kesannya sulit dan kompleks, tetapi sebenarnya simple, ilustrasinya begini ketika sebuah perusahaan telpon / provide telpon mengirimkan signal ke anda (dering telpon), mereka tidak tahu telpon apa yang anda gunakan, bisa model lama dengan dering kuno, bisa HP dengan dering music mp3, TV Phone, PDA Phone dll. yang provider tahu bahwa masing-masing telepon mempunyai ‘base type’ telepon dan mempunyai method untuk berdering. Ketika provider mengirimkan signal mereka hanya berharap bahwa telepon akan berdering tidak peduli jenis telponnya, nah provider telepon memperlakukan telepon anda secara polymorphism.
Membuat Type Polymorphism
Dari gambar diatas dapat anda lihat, ListBox is-a Control (karena ListBox turunan dari Control), Button is-a Control, kita berharap bahwa dapat memperlakukan keduanya sebagai Control. Misal anda mempunyai banyak control di collection untuk digambar ke windows, dan mengharapkan ketika memanggil method draw() pada control maka control2 tersebut akan tergambar sesuai dengan tipe objectnya (mis: ListBox, RadioButton, Command, dll).
Anda dapat mengimplementasikan polymorphism dengan dua cara yaitu:
- Membuat virtual method pada base class (class induk)
- Membuat class turunan yang mempunyai method dengan keyword override yang mengganti isi dari method dengan keyword virtual yang ada pada base class-nya.
1: public class Control {Dapat dilihat dari contoh diatas bahwa base class yaitu Window mempunyai method yang bernama DrawWindow() yang mempunyai keyword virtual, ini berarti method tersebut dapat di override atau diganti implementasinya dengan method yang nama dan parameternya sama persis di kelas turunannya yaitu class ListBox.
2: //variabel dideklarasikan private sehingga tidak bisa diakses oleh kelas
3: //turunannya
4: private int top;
5: private int left;
6:
7: protected int Top {
8: get {
9: return this.top;
10: }
11: set {
12: this.top = value;
13: }
14: }
15:
16: protected int Left {
17: get {
18: return this.left;
19: }
20: set {
21: this.left = value;
22: }
23: }
24:
25: //objek konstruktor
26: public Control(int top, int left) {
27: Top = top;
28: Left = left;
29: }
30:
31: public virtual void DrawWindow() {
32: Console.WriteLine(“Draw window pada ({0},{1})”,
33: top, left);
34: }
35:
36: }
37:
38: public class ListBox : Control {
39: //member variable baru pada class anak
40: private string listBoxContent;
41: public ListBox(int top, int left, string contents)
42: : base(top, left) {
43: this.listBoxContent = contents;
44: }
45:
46: //versi baru karena override dari base classnya
47: public override void DrawWindow() {
48: base.DrawWindow();
49: Console.WriteLine(“Menuliskan string pada listbox: {0}”,
50: listBoxContent);
51: }
52:
53: }
54:
55: public class Button : Control {
56: public Button(int top, int left) : base(top, left) {}
57:
58: public override void DrawWindow() {
59: //base.DrawWindow();
60: Console.WriteLine(“Menggambar button pada ({0},{1})”, Top, Left);
61: }
62: }
63: class LatPolymophism {
64: static void Main(string[] args) {
65: Control win = new Control(10, 15);
66: ListBox lstBox = new ListBox(5, 10, “Text pada ListBox”);
67: Button b = new Button(5, 6);
68: win.DrawWindow();
69: lstBox.DrawWindow();
70: b.DrawWindow();
71:
72: Control[] winArray = new Control[3];
73: winArray[0] = new Control(10, 15);
74: winArray[1] = new ListBox(5, 10, “Pada ListBox”);
75: winArray[2] = new Button(5, 6);
76:
77: for (int i = 0; i < 3; i++) {
78: winArray.DrawWindow();
79: }
80: }
81: }
Versioning dengan new dan override keyword
Pada contoh diatas digunakan keyword virtual pada base class agar dapat dioverride oleh class turunannya. Akan timbul masalah jika misal: Perusahan A membuat class Control kemudian perusahaan B membelinya untuk membuat ListBox dan RadioButton (tapi B tidak bisa memodifikasi class Control karena hanya beli tanpa code), pada saat membuat ListBox perusahaan B menambahkan fungsi sort() kedalam class tersebut
1: public class ListBox : Control
2: {
3: public virtual void Sort( ) {…}
4: }
Hal diatas tidak menjadi masalah sampai perusahaan A menambahkan method sort() juga dalam class Control:
1: public class Control
2: {
3: // …
4: public virtual void Sort( ) {…}
5: }
Maka akan menjadi rancu karena ada dua method dengan nama yang sama ketika anda akan memanggil method sort dari class turunan ListBox, tidak bisa dibedakan mana method sor() pada Control atau ListBox, untuk menangani masalah ini C# menyediakan keyword new.
1: public class ListBox : Control
2: {
3: public new virtual void Sort( ) {…}
4: }
Abstract Class
Setiap tipe Window pasti mempunyai bentuk tampilan yang berbeda misal combobox, listbox, button, dll. Berarti setiap class turunan dari Window harus mempunyai method DrawWindow() nya sendiri yang berbeda satu sama lain. Untuk memastikan bahwa setiap class turunan Control harus mempunyai method DrawWindow() maka anda harus mendefinisikan class tersebut sebagai abstract class dan memiliki method abstract yang belum diimplementasikan.
Abstract method tidak mempunyai implementation, abstract method hanya semacam kontrak yang harus dipenuhi. Semua class yang diturunkan dari class yang mempunyai abstract method harus mengimplementasikan method tersebut.
Class yang didefinisikan sebagai abstract class tidak dapat dibuat instan class / objek, class yang didefinisikan abstract hanya dapat digunakan dengan cara diturunkan.
1: public abstract class Control {Tapi untuk kasus diatas abstract masih mempunyai keterbatasan, jika anda ingin membuat class DropDownList yang hendak diturunkan dari class ListBox, maka anda tidak dapat memaksakan method DrawWindow() harus ada di class tersebut.
2: private int top;
3: private int left;
4:
5: protected int Top {
6: get { return this.top;}
7: set { this.top = value;}
8: }
9: protected int Left {
10: get {return this.left;}
11: set {this.left = value;}
12: }
13: public Control(int top, int left) {
14: Top = top;
15: Left = left;
16: }
17: //abstract method harus diimplementasikan
18: public abstract void DrawWindow();
19: }
20:
21: public class ListBox : Control {
22: private string listBoxContent;
23: public ListBox(int top, int left, string contents)
24: : base(top, left) {
25: this.listBoxContent = contents;
26: }
27:
28: public override void DrawWindow() {
29: Console.WriteLine(“Position {0},{1})”, Top, Left);
30: Console.WriteLine(“Menuliskan string pada listbox: {0}”,
31: listBoxContent);
32: }
33:
34: }
35:
36: public class Button : Control {
37: public Button(int top, int left) : base(top, left) { }
38: public override void DrawWindow() {
39: Console.WriteLine(“Menggambar button pada ({0},{1})”, Top, Left);
40: }
41: }
42: class LatAbstract {
43: static void Main(string[] args) {
44: Control[] winArray = new Control[3];
45: winArray[0] = new ListBox(5, 10, “Pada ListBox”);
46: winArray[1] = new Button(5, 6);
47: for (int i = 0; i < 2; i++) {
48: winArray.DrawWindow();
49: }
50: }
51: }
Sealed Class
Jika anda ingin membuat class yang tidak dapat diturunkan lagi maka anda dapat menambahkan keyword ‘sealed’.
Object Root dari semua class
Semua class dari semua type diturunkan dari satu class untama yaitu class object. Meskipun tidak dituliskan secara eksplisit namun pada dasarnya semua class diturunkan dari class object.
Beberapa method yang ada pada class object adalah: Equals(), GetHashCode(), GetType(), ToString(), Finalize(), MemberwiseClone(), ReferenceEquals().
Method dari class yang ada diatas dapat dioverride oleh semua class karena pada dasarnya semua class diturunkan dari class object.
1: public class Cat {Boxing dan Unboxing Types
2: private int weight;
3: public Cat(int weight) {
4: this.weight = weight;
5: }
6:
7: public override string ToString() {
8: return weight.ToString();
9: }
10: }
11: class LatObject {
12: static void Main(string[] args) {
13: Cat catty = new Cat(60);
14: Console.WriteLine(“Berat si catty : ” + catty);
15: }
16: }
Boxing dan Unboxing adalah suatu proses ketika suatu tipe data value (seperti int) di konversikan menjadi tipe reference / object. Istilah boxing berarti diubah menjadi object dan unboxing berarti dikembalikan lagi ke tipe data value.
Proses boxing dilakukan secara implisit jadi compiler otomatis akan melakukannya ketika kita mengisi nilai bertipe value kedalam variabel bertipe object.
1: int myIntegerValue = 5;
2: object myObject = myIntegerValue; // cast to an object
3: myObject.ToString();
Tidak seperti boxing, proses unboxing harus eksplisit. Ketika proses unbox kita harus tahu tipe data apa yang kita ingin konversikan dari tipe objek-nya.
1: int myInt = 123;
2: //proses boxing (dilakukan secara otomatis)
3: object objInt = myInt;
4: Console.WriteLine(“Nilai ObjInt : {0}”,objInt.ToString());
5:
6: //proses unboxing (harus dilakukan secara eksplisit)
7: myInt = (int)objInt;
8: Console.WriteLine(“Nilai myInt : {0}”, myInt.ToString());
Menghindari Boxing dan unboxing dengan Generic
Proses boxing dan unboxing mempengaruhi performa program, karena semua harus di boxing kedalam tipe object (misal: dalam penggunaan ArrayList). Pada C# 2.0 keatas sudah mendukung generic sehingga proses boxing dan unboxing dapat dihindari.
Interfaces
Jika anda ingin mendefinisikan tipe baru tetapi tidak ingin mengimplementasikan isinya secara langsung maka anda dapat menggunakan interfaces.
Pada dasarnya interface adalah sebuah kontrak, ketika anda mendesign interface seolah-olah anda mengatakan “jika anda ingin menggunakan class ini maka anda harus mengimplementasikan method, property yang sudah disediakan”. Class yang menggunakan interface tersebut setuju dengan kontrak dan mengimplementasikan requirement yang ditentukan.
Dibandingkan dengan abstract class, abstract class hanya bisa digunakan di class paling atas ‘top-hierarchy’ sedangkan interface dapat digunakan di setiap class yang diinginkan (setiap class dapat mengimplementasikan lebih dari satu interface).
Perbedaan Interface dan Abstract Class
Programmer sering merasa bingung dalam mebedakan Interface dan Abstract Class. Beberapa perbedaannya adalah:
- Cara penggunaan Abstract Class adalah diturunkan, sedangkan cara penggunaan Interface adalah diimplementasikan.
- Pada C# lambang untuk menurunkan class dan menggunakan interfaces sama-sama menggunakan tanda “:” (titik dua). Tetapi untuk membedakan biasanya nama interface diawali dengan huruf I di depan misal: IEnumerable, IDisposable, dll.
- Sebuah class hanya dapat diturunkan dari satu abstract class tapi dapat menggunakan lebih dari satu interfaces.
- Method dan member variable pada abstract class boleh sudah ada isinya, sedangkan pada interfaces semua belum ada implementasinya.
- Pada Abstract Class semua method / member variable yang abstract harus diimplementasikan di class turunannya.
- Pada Interface semua member variable dan method harus diimplementasikan di class yang menggunakan interface tersebut.
- Access Modifier pada method dan member variable di Interface secara implisit adalah public.
1: interface IStorable {Mengimplementasikan lebih dari satu Interface
2: void Read();
3: void Write();
4: int Status { get; set; }
5: }
6:
7: public class Document : IStorable {
8: private int status = 0;
9:
10: public Document(string s) {
11: Console.WriteLine(“Create : {0}”, s);
12: }
13:
14: public void Read() {
15: Console.WriteLine(“Mengimplementasikan method Read dari IStorable”);
16: }
17:
18: public void Write() {
19: Console.WriteLine(“Mengimplementasikan method Write dari IStorable”);
20: }
21:
22: public int Status {
23: get { return this.status; }
24: set { this.status = value; }
25: }
26: }
27:
28: class LatSimpleInterface {
29: static void Main(string[] args) {
30: Document doc = new Document(“New Document”);
31: doc.Read();
32: doc.Write();
33: doc.Status = 1;
34: Console.WriteLine(“Document status : {0}”, doc.Status);
35: }
36: }
Pada C# sebuah class hanya dapat diturunkan dari sebuah class saja, tidak seperti bahasa C++ yang mendukung multipe inheritance. Tetapi untuk interface anda dapat menggunakan lebih dari satu interface dalam sebuah class.
Misal saja untuk class dokumen diatas dapat disimpan dan dapat juga dikompres datanya, maka anda dapat menambahkan interface Icompressible kedalam class tersebut.
Interface juga dapat dikombinasikan, anda bisa menambahkan inteface kedalam interface lain, misal:
1: interface ICompessible {
2: void Compress();
3: void Decompress();
4: }
5: interface ILoggedCompresible : ICompessible {
6: void LogSavedBytes();
7: }
Ketika anda menggunakan interface IloggedCompresible maka anda harus mengimplementasikan method Compress(), Decompress(), dan LogSavedBytes().
1: interface IStorable {Delegates dan Event
2: void Read();
3: void Write(object obj);
4: int Status { get; set; }
5: }
6:
7: interface ICompressible {
8: void Compress();
9: void Decompress();
10: }
11:
12: interface ILoggedCompressible : ICompressible {
13: void LogSavedBytes();
14: }
15:
16: interface IStorableCompressible : IStorable, ILoggedCompressible{
17: void LogOriginalSize();
18: }
19:
20: interface IEncryptable {
21: void Encrypt();
22: void Decrypt();
23: }
24:
25: public class Document : IStorableCompressible, IEncryptable {
26: private int status = 0;
27:
28: public Document(string s) {
29: Console.WriteLine(“Creating Document: {0}”, s);
30: }
31:
32: public void LogOriginalSize() {
33: Console.WriteLine(“Mengimplementasikan method LogOriginalSize”);
34: }
35:
36: public void Read() {
37: Console.WriteLine(“Mengimplementasikan method Read”);
38: }
39:
40: public void Write(object obj) {
41: Console.WriteLine(“Mengimplementasikan method Write”);
42: }
43:
44: public int Status {
45: get { return status; }
46: set { this.status = value; }
47: }
48:
49: public void LogSavedBytes() {
50: Console.WriteLine(“Mengimplementasikan method LogSavedBytes”);
51: }
52:
53: public void Compress() {
54: Console.WriteLine(“Mengimplementasikan method Compress”);
55: }
56:
57: public void Decompress() {
58: Console.WriteLine(“Mengimplementasikan method Decompress”);
59: }
60:
61: public void Encrypt() {
62: Console.WriteLine(“Mengimplementasilan method Encrypt”);
63: }
64:
65: public void Decrypt() {
66: Console.WriteLine(“Mengimplementasikan method Decrypt”);
67: }
68: }
69:
70: class LatMultipleInterface {
71: static void Main(string[] args) {
72: Document doc = new Document(“New Document”);
73: doc.Read();
74: doc.Compress();
75: doc.LogSavedBytes();
76: doc.LogOriginalSize();
77: doc.Encrypt();
78: doc.Decrypt();
79: doc.Decompress();
80: doc.Status = 1;
81: Console.WriteLine(“Status {0}”, doc.Status);
82: }
83: }
Mungkin anda pernah menjumpai situasi dimana anda ingin mengeksekusi suatu action tetapi anda belum tahu pasti isi dari detail methodnya atau bahkan tidak tahu objectnya. Misal method untuk menghandle button press (ketika object button tersebut ditekan). Anda harus membayangkan bahwa pembuat komponen button, textbox, listbox bukanlah programmer yang menggunakan object tersebut. Pembuat button hanya tahu bahwa button tersebut mempunyai event click (ketika diklik) tapi pembuat buton tidak tahu apa yang terjadi ketika button tersebut diklik (hanya diketahui oleh programmer yang menggunakan button tersebut).
Untuk mengatasi masalah diatas pembuat button sudah menyediakan event misal click, mouse_mive, dll. jika programmer hendak menggunakannya maka dapat mengaksesnya menggunakan delegates. Delegates adalah semacam kontrak yang harus dipenuhi ketika hendak menggunakan method tertentu (mirip dengan interfaces).
1: delegate void StringProcesssor(string input);
2: class Person {
3: private string name;
4:
5: public Person(string name) {
6: this.name = name;
7: }
8:
9: public void Say(string message) {
10: Console.WriteLine(“{0} says : {1}”, name, message);
11: }
12: }
13:
14: class Background {
15: public static void Note(string note) {
16: Console.WriteLine(“({0}) “, note);
17: }
18: }
19:
20: class LatSimpleDelegates {
21: static void Main(string[] args) {
22: Person rick = new Person(“Erick”);
23: Person jhon = new Person(“Jhon”);
24: StringProcesssor jonsVoice, rickVoice, background;
25: rickVoice = new StringProcesssor(rick.Say);
26: jonsVoice = new StringProcesssor(jhon.Say);
27: background = new StringProcesssor(Background.Note);
28:
29: rickVoice(“Hello Jhon !!”);
30: jonsVoice(“Hello rick !!”);
31: background(“Suara ramai lalu lintas”);
32: }
33: }
SELESAI
BAB I
PENDAHULUAN
1.1 Pengenalan Framework .NET
Framework .NET adalah suatu komponen windows yang terintegrasi yang
dibuat dengan tujuan untuk mensupport pengembangan berbagai macam jenis
aplikasi serta untuk dapat mejalankan berbagai macam aplikasi generasi
mendatang termasuk pengembangan aplikasi Web Services XML.Framework .NET di design untuk dapat memenuhi beberapa tujuan berikut ini :
- · Untuk menyediakan environment kerja yang konsisten bagi bahasa pemrograman yang berorientasi objek (object-oriented programming – OOP) baik kode objek itu di simpan dan di eksekusi secara lokal, atau dieksekusi secara lokal tapi didistribusikan melalui internet atau dieksekusi secara remote.
- · Untuk menyediakan environment kerja di dalam mengeksekusi kode yang dapat meminimaliasi proses software deployment dan menghindari konflik penggunaan versi software yang di buat.
- · Untuk menyediakan environment kerja yang aman dalam hal pengeksekusian kode, termasuk kode yang dibuat oleh pihak ketiga (third party).
- · Untuk menyediakan environment kerja yang dapat mengurangi masalah pada persoalan performa dari kode atau dari lingkungan interpreter nya.
- · Membuat para developer lebih mudah mengembangkan berbagai macam jenis aplikasi yang lebih bervariasi, seperti aplikasi berbasis windows danaplikasi berbasis web.
- · Membangun semua komunikasi yang ada di dalam standar industri untuk
- · memastikan bahwa semua kode aplikasi yang berbasis Framework .NET dapat
- · Berintegrasi dengan berbagai macam kode aplikasi lain.
Ada dua komponen utama dalam Framework .NET yaitu Common Language Runtime (CLR) dan .NET Framework Class Library. Common Language Runtime (CLR) adalah pondasi utama dari Framework .NET. CLR merupakan komponen yang bertanggung jawab terhadap berbagai macam hal, seperti bertanggung jawab untuk melakukan managemen memory, melakukan eksekusi kode, melakukan verifikasi terhadap keamanan kode, menentukan hak akses dari kode, melakukan kompilasi kode, dan berbagai layanan system lainnya. Dengan adanya fungsi CLR ini, maka aplikasi berbasis .NET biasa juga disebut dengan managed code, sedangkan aplikasi di luar itu biasa disebut dengan un-managed code. CLR akan melakukan kompilasi kode-kode aplikasi kita menjadi bahasa assembly MSIL (Microsoft Intermediate Language). Proses kompilasi ini sendiri dilakukan oleh komponen yang bernama Just In Time (JIT). JIT hanya akan mengkompilasi metode metode yang memang digunakan dalam aplikasi, dan hasil kompilasi ini sendiri di chace di dalam mesin dan akan dikompile kembali jika memang ada perubahan pada kode aplikasi kita.
.NET Framework Class Library atau sering juga disebut Base Case Library (BCL) adalah koleksi dari reusable types yang sangat terintegrasi secara melekat dengan CLR. Class library bersifat berorientasi terhadap objek yang akan menyediakan types dari fungsi-fungsi managed code. Hal ini tidak hanya berpengaruh kepada kemudahan dalam hal penggunaan, tetapi juga dapat mengurangi waktu yang diperlukan pada saat eksekusi. Dengan sifat tersebut, maka komponen pihak ketiga akan dengan mudah diaplikasikan ke dalam aplikasi yang dibuat. Dengan adanya BCL ini, maka kita bisa menggunakan Framework .NET untuk membuat berbagai macam aplikasi, seperti :
- · Aplikasi console
- · Aplikasi berbasis windowd (Windows Form)
- · Aplikasi ASP.NET (berbasis web)
- · Aplikasi Web Services XML
- · Aplikasi berbasis Windows Services
BAB II
PENGENALAN BAHASA C# (DIBACA ““SEE-SHARP”)
C# adalah bahasa pemrograman baru yang diciptakan oleh Microsoft
yang dikembangkan dibawah kepemimpinan Anders Hejlsberg yang telah
menciptakan berbagai macam bahasa pemrograman termasuk Borland Turbo C++
dan orland Delphi. Bahasa C# juga telah di standarisasi secara
internasional oleh ECMA. Seperti halnya bahasa pemrograman yang lain, C#
bisa digunakan untuk membangun berbagai macam jenis aplikasi, seperti
aplikasi berbasis windows (desktop) dan aplikasi berbasis web serta
aplikasi berbasis web services.2.1 Feature dalam C#
Sebagai bahasa pemrograman baru C# banyak mengadopsi feature dari beberapa bahasa perogrmaan terkenal dan banyak komunitasnya tetapi yang paling dominan adalah Java adapun komposisinya adalah sebagai berikut 70% Java, 10% C++, 5% Visual Basic, 15% baru.
Feature yang sama dengan JAVA
• Object-orientation (single inheritance)
• Interfaces
• Exceptions
• Threads
• Namespaces (like Packages)
• Strong typing
• Garbage Collection
• Reflection
• Dynamic loading Code
• …..
Feature yang sama dengan C++
• (Operator) Overloading
• Pointer arithmetic in unsafe code
• Some syntactic details
Adapun Feature barunya jika dikomper dengan Java adalah sebagai berikut :
• Reference and output parameters
• Objects on the stack (structs)
• Rectangular arrays
• Enumerations
• Unified type system
• goto
• Versioning
• Component-based programming
- Properties
- Events
• Delegates
• Indexers
• Operator overloading
• foreach statements
• Boxing/unboxing
• Attributes
2.2 Key word C#
C# adalah bahasa pemrograman yang menggunakan jumlah kata-kata yang tidak terlalu banyak. C# hanya berisi kata-kata yang biasa disebut dengan keywords. Keywords ini digunakan untuk menjelaskan berbagai macam informasi. Berikut daftar keywords yang ada dalam bahasa C# :
abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static stringstruct switch this throw true try typeof uint ulong unchecked unsafeushort using virtual void while
2.3 Struktur File C#
2.4 Penulisan Kode C#
Langkah-langkah penulisan kode C#
1. Kode program diawali dengan mendeklarasikan nama Class atau namespace
2. Aplikasi dibuka dengan tanda “{“ dan pada akhir kode ditutup dengan tanda “}”.
3. Aplikasi C# dibangun oleh satu atau beberapa fungsi yang diletakan di dalam sebuah Class dengan ketentuan sebagai berikut .
- · Nama suatu fungsi pada C# harus diawali dengan huruf, atau garis bawah “_” yang kemudian bisa diikuti oleh huruf, angka atau garis bawah.
- · Pada bagian akhir nama fungsi digunakan tanda kurung buka dan kurung tutup “()”.
- · Penamaan fungsi tidak boleh mengandung spasi. Awal dan akhir suatu fungsi di mulai dengan tanda “{“ dan diakhiri dengan tanda “}”.
- · Penulisan komentar ( tulisan yang tidak di eksekusi) dapat dibuat sebagai berikut
- · Komentar satu baris dengan menggunakan tanda “//”
- · Komenter yang lebih dari satu baris dengan di awali tanda “/*” dan diakhiri oleh “*/”
{
// Bagian utama program C# à ini adalah contoh komentar 1 baris
public static void Main()
{
System.Console.WriteLine(“Hello, World”);
}
/* ini cantoh komentar
lebih dari satu baris */
}
2.5. Escape Sequences
Escape Sequences adalah karakter-karakter khusus yang tidak akan itampilkan.
Contohnya, ada karakter yang digunakan sebagai tanda akhir dari suatu baris
yang memerintahkan program untuk melanjutkan ke baris berikutnya. Cara
penulisannya diawali dengan tanda \ diikuti dengan karakter khusus (dalam
contoh ini adalah “n”) sehingga penulisannya menjadi \n.
BAB III
TIPE DATA DAN VARIABLE
3.1 Tipe Data (Data Type)Dalam membuat suatu aplikasi akan dijumpai berbagai jenis tipe data. Setiap tipe data memiliki fungsi yang berbeda-beda antara satu tipe data dengan yang lainnya. Berikut ini penjelasan tipe data dalam C#.
3.1.1 Unified Type System
3.1.2 Value Types versus Reference Types
3.1.3 Simple Type
Long Form in Java Range
sbyte System.SByte byte -128 .. 127
byte System.Byte — 0 .. 255
short System.Int16 short -32768 .. 32767
ushort System.UInt16 — 0 .. 65535
int System.Int32 int -2147483648 ..2147483647
uint System.UInt32 — 0 .. 4294967295
long System.Int64 long -263 .. 263-1
ulong System.UInt64 — 0 .. 264-1
float System.Single float ±1.5E-45 .. ±3.4E38 (32 Bit)
double System.Double double ±5E-324 .. ±1.7E308 (64 Bit)
decimal System.Decimal — ±1E-28 .. ±7.9E28 (128 Bit)
bool System.Boolean boolean true, false
char System.Char char Unicode character
Variabel
Variabel dapat didefinisikan sebagai tempat untuk menyimpan data yang memiliki suatu Tipe data, variabel ini akan diwakili oleh suatu lokasi di memori komputer kita. Dengan nggunakan nama variabel ini kita akan dapat mengaskes data yang tersimpan di memori tersebut.
Penamaan Variabel
Aturan dalam pembuatan variable adalah sebagai berikut :
- · Terdiri dari huruf, angka dan under score (_)
- · Nama harus diawali dengan huruf. Under score juga dapat digunakan untuk mengawali nama suatu variabel tetapi ini tidak disarankan.
- · C# adalah bahasa yang case sensitif, variabel dengan nama umur tidak sama dengan Umur.
- · Keyword tidak bisa digunakan sebagai nama variabel, kecuali kalau keyword ini diawali dengan karakter @.
Nama Variabel Benar/Salah
KodeBarang Benar
Nama_barang Benar
_Jumlah Benar : tetapi tidak disarankan
@int Benar : keyword diawali dengan @
Int Salah : karena int adalah keyword
Harga Barang Salah : menggunakan spasi
Harga#barang Salah : menggunakan tanda #
1X Salah : diawali oleh angka
@int Benar : keyword diawali dengan @
3.2.2 Deklarasi Variable
Ada 3 cara dalam mendeklarasikan/penulisan Variabel adalah sebagai berikut
1. TypeData Nama_variabel;
Contoh :
string nama_barang;
int jumlah;
nama_barang=”Buku”;
jumlah=2;
2. TypeData Nama_variabel=initial_value
Initial_value dalah nilai awal yang diberikan terhadap variable tersebut ketika variable tersebut pertama kali dibaca
Contoh :
string nama_barang=”Buku”;
int jumlah=2;
3. TypeData Nama_variabel1, Nama_variabel2, Nama_variabel2;
Apabila ada beberapa variable yang mememiliki tipe data yang sama maka dapat ditulis sebagai berikut :
string kode_barang,nama_barang;
Arithmetic Operator (Operator Aritmatika)
menggunakan operator arithmetic dasar :
Operator Aksi Contoh Penejelasan
+ Penjumlahan 5 + 9 Menghasilkan nilai : 14
- Pengurangan 9 – 4 Menghasilkan nilai : 5
* Perkalian 5 * 6 Menghasilkan nilai : 30
/ Pembagian 20 / 4 Menghasilkan nilai : 5
% Modulus 9 % 4 Menghasilkan nilai : 1
Beberapa operator perbandingan yang lain adalah sebagai berikut :
Operator Arti Contoh Menghasilkan benar (true) ketika :
== Sama dengan $i == $j $i dan $j mempunyai nilai yang sama
< Kurang dari $i < $j $i kurang dari $j
> Lebih dari $i > $j $i lebih dari $j
<= Kurang dari atau sama dengan $i <= $j $i kurang dari atau sama dengan $j
>= Lebih dari atau sama dengan $i >= $j $i lebih dari atau sama dengan $j
!= Tidak sama dengan $i != $j $i tidak sama dengan $j
<> Tidak sama dengan $i <> $j $i tidak sama dengan $j
Komentar (Remark)
n /* … */
n //
n #
BAB IV
SELECTION
Toeri :
Selection statement digunakan untuk menentukan bagian mana dari
program yang akan dieksekusi selanjutnya. C# menyediakan dua jenis
selection yaitu if dan switch4.1 if
If statement digunakan untuk mengeksekusi kode program jika kondisi tertentu terpenuhi.
Formula
If (kriteria)
{
Statement bernilai True (sesuai dengan criteria)
}
Contoh:
class ContohIf
{
public static void Main2()
{
Console.Write(“Masukkan nilai x : “);
int x = int.Parse(Console.ReadLine());
Console.Write(“Masukkan nilai y : “);
int y = int.Parse(Console.ReadLine());
if (y!=0)
{
double hasil = x/y;
Console.WriteLine(“Hasil pembagian x/y = {0}”,hasil);
}
Console.ReadLine();
}
}
4.2 if – else
Satu variasi dari if statement adalah if-else. Dalam statement ini, selain menentukan langkah apa yang harus dilakukan jika suatu kondisi terpenuhi, kita juga bisa menentukan langkah apa yang mesti dilakukan kalau kondisi tersebut TIDAK terpenuhi.
Formula
If (kriteria)
{
Statement bernilai True (sesuai dengan kriteria)
}
else
{
Statement bernilai false (tidak sesuai dengan kriteria)
}
class ContohIfElse
{
public static void Main2()
{
Console.Write(“Masukkan nilai x : “);
int x = int.Parse(Console.ReadLine());
Console.Write(“Masukkan nilai y : “);
int y = int.Parse(Console.ReadLine());
if (y!=0)
{
double hasil = x/y;
Console.WriteLine(“Hasil pembagian x/y = {0}”,hasil);
}
else
{
Console.WriteLine(“y bernilai 0″);
}
Console.ReadLine();
}
}
4.3 if else if
Satu variasi dari if statement adalah if-else. Dalam statement ini, selain menentukan
langkah apa yang harus dilakukan jika suatu kondisi terpenuhi, kita juga bisa
menentukan langkah apa yang mesti dilakukan kalau kondisi tersebut TIDAK terpenuhi.
Formula
If (kriteria1)
{
Statement bernilai True (sesuai dengan kriteria1
}
else if (kriteria2)
{
Statement bernilai True (sesuai dengan kriteria2
}
4.4 Switch
Logika dari statement switch secara prinsip sama dengan stement if
Praktek 3
class ContohSwitch
{
public static void Main2()
{
switch (DateTime.Now.DayOfWeek)
{
case DayOfWeek.Sunday:
{
Console.WriteLine(“Sekarang hari Minggu”);
break;
}
case DayOfWeek.Monday:
{
Console.WriteLine(“Sekarang hari Senin”);
break;
}
case DayOfWeek.Tuesday:
{
Console.WriteLine(“Sekarang hari Selasa”);
break;
}
default:
{
Console.WriteLine(“Sekarang hari apa ya?”);
break;
}
}
Console.ReadLine();
}
}
BAB V
ITERASI
Iteration statement adalah jenis perintah yang digunakan untuk
menentukan bagian mana dari program yang akan dieksekusi berulang-ulang
dan kondisi apa yang menentukan perulangan tersebut.5.1 While
while statement berguna untuk melakukan perulangan selama kondisi true.
Formula
while (kondisi iterasi)
{
Statement yang diulang
}
Contoh program
using System;
class ContohWhile
{
public static void Main ()
{
int i = 0;
while (i<10)
{
if (i%2==0)
{
Console.WriteLine(“Angka genap: ” + i);
}
i += 1;
}
Console.ReadLine();
}
}
5.2 Do while
Statemen do memiliki kesamaan dengan statement while yaitu untuk melakukan
perulangan
Formula
do
{
Statement yang diulang
}
while (kondisi iterasi)
Contoh program
using System;
class ContohDo
{
public static void Main()
{
int i = 0;
do
{
if (i%2==0)
{
Console.WriteLine(“Angka genap: ” + i);
}
i += 1;
}
while (i<10);
Console.ReadLine();
}
}
5.3 For
For digunakan untuk melakukan perulangan yang didasarkan atas nilai diskrit
misalnya integer
Formula
for (nilai awal, kondisi akhir, step pengulangan)
{
Statemen yang akan diulang
}
Contoh :
using System;
class ContohFor
{
public static void Main2()
{
string[] drives = System.Environment.GetLogicalDrives();
for (int i=0; i<drives.Length; i++)
{
Console.WriteLine(“drive ” + drives[i]);
}
Console.ReadLine();
}
}
5.4 Foreach
Statement Foreach digunakan utuk menelusuri collection, misalnya array
Contoh :
using System;
class ContohForeach
{
public static void Main2()
{
string[] drives = System.Environment.GetLogicalDrives();
foreach (string drive in drives)
{
Console.WriteLine(“drive ” + drive);
}
Console.ReadLine();
}
}
BAB VI
JUMP STATEMENT
Jump Statement berfungsi untuk mentransfer kontrol eksekusi dari suatu bagian ke bagian yang lain.6.1 Break
Statement break berfungsi untuk keluar dari statement for, while, do dan switch yang pernah dibahas sebelumnya.
Contoh :
using System;
class ContohBreak
{
public static void Main()
{
for (int i=0; i<10; i++)
{
Console.WriteLine(“i=” + i);
if (i==5) break;
}
Console.ReadLine();
}
}
6.2 continue
Statement continue berfungsi melanjutkan eksekusi program ke iterasi berikutnya :
Contoh :
using System;
class ContohContinue
{
public static void Main2()
{
for (int i=0; i<10; i++)
{
if (i==5) continue;
Console.WriteLine(“i=” + i);
}
Console.ReadLine();
}
}
6.3 goto
statement goto berfungsi untuk melanjutkan ekseskusi ke label yang telah didefinisikan sebelumnya
contoh :
using System;
class ContohGoto
{
public static void Main2()
{
for (int i=0; i<10; i++)
{
if (i==5) goto selesai;
Console.WriteLine(“i=” + i);
}
selesai:
Console.ReadLine();
}
}
6.4 return
Statement return digunakan untuk mengembalikan kontrol ekseskusi ke pemanggil.
using System;
class ContohReturn
{
public static void FungsiB()
{
Console.WriteLine(“FungsiB”);
Console.WriteLine(“Akan menjalankan return …”);
return;
}
public static void FungsiA()
{
Console.WriteLine(“FungsiA”);
Console.WriteLine(“Akan memanggil FungsiB”);
FungsiB();
Console.WriteLine(“Melanjutkan perintah FungsiA berikutnya”);
}
Konsep Bahasa Pemrograman dengan C#
Oleh : Muhamad Zen SKom.M.M
public static void Main2()
{
FungsiA();
Console.ReadLine();
}
}
6.5 throw
statement throw digunakan untuk membangkitkan exceptionI dalam program.
Contoh
using System;
class ContohThrow
{
public static void Main2()
{
try
{
Console.Write(“Ketik nama Anda: “);
string nama = Console.ReadLine();
if (nama!=”risman”)
throw new System.ApplicationException(“Nama tidak dikenal”);
Console.Write(“Selamat, Anda termasuk orang terkenal “);
}
catch(ApplicationException ae)
{
Console.WriteLine (“Exception: ” + ae.Message);
}
Console.ReadLine();
}
}
BAB VII
METHOD
Method adalah bagian dari tubuh program yang mengimplementasikan suatu action sehingga class atau object bekerja.7.1 Static Methods
Method dapat di overload, yaitu nama suatu method dapat dipakai berkali-kali
selama method tersebut memiliki sesuatu yang unik. Static method hanya
bisa diakses melalui classnya saja.
Contoh
class Program
{
static void contohmethod()
{
Console.WriteLine(“Method Tanpa Parameters”);
}
static void contohmethod(int value1,int value2)
{
Console.WriteLine(“Nilai dari parameter1 ” + value1.ToString() );
Console.WriteLine(“Nilai dari parameter2 ” + value2.ToString());
}
static void contohmethod(ref int value)
{
value = value + 9;
Console.WriteLine(“Nilai Parameters dengan metoda Ref ” + value.ToString() );
}
static void Main(string[] args)
{
contohmethod();
int v1 = 10;
int v2 = 20;
contohmethod(v1, v2);
int r = 10;
contohmethod(ref r);
Console.ReadLine();
}
}
7.2 non static metho
non static method adalah method yang dapat diakses melalui instance-nya
contoh :
class First
{
public virtual void one()
{
Console.WriteLine(“Class First One”);
}
}
class Second : First
{
public override void one()
{
Console.WriteLine(“Class Second One”);
}
}
class Program
{
static void Main(string[] args)
{
First x = new First() ;
Second y = new Second() ;
x.one();
y.one();
Console.ReadLine();
}
}
Praktek Konsep Bahasa Pemrograman (C#)
- 1. Operasional Variabel
Variabel dapat didefinisikan sebagai tempat untuk menyimpan data yang memiliki suatu Tipe data, variabel ini akan diwakili oleh suatu lokasi di memori komputer kita. Dengan nggunakan nama variabel ini kita akan dapat mengaskes data yang tersimpan di memori tersebut.
Penamaan Variabel
Aturan dalam pembuatan variable adalah sebagai berikut :
- Terdiri dari huruf, angka dan under score (_)
- Nama harus diawali dengan huruf. Under score juga dapat digunakan
untuk mengawali nama suatu variabel tetapi ini tidak disarankan.
- C# adalah bahasa yang case sensitif, variabel dengan nama umur tidak sama
- Keyword tidak bisa digunakan sebagai nama variabel, kecuali kalau keyword ini diawali dengan karakter @.
Nama Variabel
|
Benar/Salah
|
KodeBarang | Benar |
Nama_barang | Benar |
_Jumlah | Benar : tetapi tidak disarankan |
@int | Benar : keyword diawali dengan @ |
Int | Salah : karena int adalah keyword |
Harga Barang | Salah : menggunakan spasi |
Ada 3 cara dalam mendeklarasikan/penulisan Variabel adalah sebagai berikut
- TypeData Nama_variabel;
string nama_barang;
int jumlah;
nama_barang=”Buku”;
jumlah=2;
- TypeData Nama_variabel=initial_value
Contoh :
string nama_barang=”Buku”;
int jumlah=2;
- TypeData Nama_variabel1, Nama_variabel2, Nama_variabel2;
string kode_barang,nama_barang;
Praktek 1. Membaca Nilai dari suatu variabel
class Bacanilaivariabel
{
static void Main(string[] args)
{
string nip = “200722001″;
string nama = “M. Zen”;
int nilai = 85;
Console.WriteLine(“Nip ” + nip);
Console.WriteLine(“Nama ” + nama );
Console.WriteLine(“Nilai ” + nilai.ToString());
Console.ReadLine();
}
}
Keterangan :
Console.WriteLine : Menampilkan satu baris Teks di layar dan kursor akan pindah kebaris berikutnya
Console.ReadLine : Membaca Input Nilai dari suatu vairiabel dan setelah penulisan kursor akan berpindah kebaris berikutnya
Praktek 2 Input Variabel
class inputvariabel
{
static void Main(string[] args)
{
float total
Console.Write(“NAMA : “);
string x = Console.ReadLine()
Console.Write(“Gaji : “);
float gaji = float.Parse(Console.ReadLine());
Console.Write(“Tunjangan : “);
float tunjangan = float.Parse(Console.ReadLine());
Console.Write(“potongan : “);
float potongan = float.Parse(Console.ReadLine());
total = gaji + tunjangan – potongan;
Console.WriteLine(“Total Gaji :” + total.ToString());
Console.ReadLine();
}
}
- 2. Selection Statemen
Selection statement digunakan untuk menentukan bagian mana dari program yang akan
Dieksekusi selanjutnya. C# menyediakan dua jenis selection yaitu if danswitch.
2.1 if
If statement digunakan untuk mengeksekusi kode program jika kondisi tertentu
terpenuhi.
Praktek 1.
class ContohIf
{
public static void Main2()
{
Console.Write(“Masukkan nilai x : “);
int x = int.Parse(Console.ReadLine());
Console.Write(“Masukkan nilai y : “);
int y = int.Parse(Console.ReadLine());
if (y!=0)
{
double hasil = x/y;
Console.WriteLine(“Hasil pembagian x/y = {0}”,hasil);
}
Console.ReadLine();
}
}
2.2 if else
Satu variasi dari if statement adalah if-else. Dalam statement ini, selain menentukan
langka apa yang harus dilakukan jika suatu kondisi terpenuhi, kita juga bisa
menentukan langkah apa yang mesti dilakukan kalau kondisi tersebut TIDAK terpenuhi.
Praktek 2
class ContohIfElse
{
public static void Main2()
{
Console.Write(“Masukkan nilai x : “);
int x = int.Parse(Console.ReadLine());
Console.Write(“Masukkan nilai y : “);
int y = int.Parse(Console.ReadLine());
if (y!=0)
{
double hasil = x/y;
Console.WriteLine(“Hasil pembagian x/y = {0}”,hasil);
}
else
{
Console.WriteLine(“y bernilai 0″);
}
Console.ReadLine();
}
}
2.3 Switch
Logika dari statement switch secara prinsip sama dengan stement if
Praktek 3
class ContohSwitch
{
public static void Main2()
{
switch (DateTime.Now.DayOfWeek)
{
case DayOfWeek.Sunday:
{
Console.WriteLine(“Sekarang hari Minggu”);
break;
}
case DayOfWeek.Monday:
{
Console.WriteLine(“Sekarang hari Senin”);
break;
}
case DayOfWeek.Tuesday:
{
Console.WriteLine(“Sekarang hari Selasa”);
break;
}
default:
{
Console.WriteLine(“Sekarang hari apa ya?”);
break;
}
}
Console.ReadLine();
}
}
- 3. ARRAY
3.1 Meng- initialize array
- Dengan menggunakan keyword new untuk menentukan jumlah element array
contoh
string[] namabulan = new string[12];
namabulan[0]=” ”;
namabulan[1]=”januari”;
namabulan[12]=”Desember”
- Dengan cara memberikan nilai saat deklarasi array
Contoh :
String[] namabulan={“Januari”,”Pebruari”,”…”,”Desember”}
String[] namabulan=new string[] {“Januari”,”Pebruari”,”…”,”Desember”}
4. ITERATION STATEMENT
Iteration statement adalah jenis perintah yang digunakan untuk menentukan bagian mana dari program yang akan dieksekusi berulang-ulang dan kondisi apa yang menentukan perulangan tersebut.
while
while statement berguna untuk melakukan perulangan selama kondisi true.
Contoh program
using System;
class ContohWhile
{
public static void Main ()
{
int i = 0;
while (i<10)
{
if (i%2==0)
{
Console.WriteLine(“Angka genap: ” + i);
}
i += 1;
}
Console.ReadLine();
}
}
DO
Statemen DO memiliki kesamaan dengan statement while yaitu untuk melakukan perulangan
Contoh program
using System;
class ContohDo
{
public static void Main()
{
int i = 0;
do
{
if (i%2==0)
{
Console.WriteLine(“Angka genap: ” + i);
}
i += 1;
}
while (i<10);
Console.ReadLine();
}
}
For
For digunakan untuk melakukan perulangan yang didasarkan atas nilai diskrit misalnya integer
Contoh :
using System;
class ContohFor
{
public static void Main2()
{
string[] drives = System.Environment.GetLogicalDrives();
for (int i=0; i<drives.Length; i++)
{
Console.WriteLine(“drive ” + drives[i]);
}
Console.ReadLine();
}
}
Foreach
Statement Foreach digunakan utuk menelusuri collection, misalnya array
Contoh :
using System;
class ContohForeach
{
public static void Main2()
{
string[] drives = System.Environment.GetLogicalDrives();
foreach (string drive in drives)
{
Console.WriteLine(“drive ” + drive);
}
Console.ReadLine();
}
}
5. JUMP STATEMENT
Jump Statement berfungsi untuk mentransfer kontrol eksekusi dari suatu bagian ke bagian yang lain.
Break
Statement break berfungsi untuk keluar dari statement for, while, do dan switch yang pernah dibahas sebelumnya.
Contoh :
using System;
class ContohBreak
{
public static void Main()
{
for (int i=0; i<10; i++)
{
Console.WriteLine(“i=” + i);
if (i==5) break;
}
Console.ReadLine();
}
}
continue
Statement continue berfungsi melanjutkan eksekusi program ke iterasi berikutnya :
Contoh :
using System;
class ContohContinue
{
public static void Main2()
{
for (int i=0; i<10; i++)
{
if (i==5) continue;
Console.WriteLine(“i=” + i);
}
Console.ReadLine();
}
}
goto
statement goto berfungsi untuk melanjutkan ekseskusi ke label yang telah didefinisikan sebelumnya
contoh :
using System;
class ContohGoto
{
public static void Main2()
{
for (int i=0; i<10; i++)
{
if (i==5) goto selesai;
Console.WriteLine(“i=” + i);
}
selesai:
Console.ReadLine();
}
}
return
Statement return digunakan untuk mengembalikan kontrol ekseskusi ke pemanggil.
using System;
class ContohReturn
{
public static void FungsiB()
{
Console.WriteLine(“FungsiB”);
Console.WriteLine(“Akan menjalankan return …”);
return;
}
public static void FungsiA()
{
Console.WriteLine(“FungsiA”);
Console.WriteLine(“Akan memanggil FungsiB”);
FungsiB();
Console.WriteLine(“Melanjutkan perintah FungsiA berikutnya”);
}
public static void Main2()
{
FungsiA();
Console.ReadLine();
}
}
throw
statement throw digunakan untuk membangkitkan exceptionI dalam program.
Contoh
using System;
class ContohThrow
{
public static void Main2()
{
try
{
Console.Write(“Ketik nama Anda: “);
string nama = Console.ReadLine();
if (nama!=”risman”)
throw new System.ApplicationException(“Nama tidak dikenal”);
Console.Write(“Selamat, Anda termasuk orang terkenal “);
}
catch(ApplicationException ae)
{
Console.WriteLine (“Exception: ” + ae.Message);
}
Console.ReadLine();
}
}
6. Method
Method adalah bagian dari tubuh program yang mengimplementasikan suatu action sehingga class atau object bekerja.
6.1 Static Methods
Method dapat di overload, yaitu nama suatu method dapat dipakai berkali-kali selama method tersebut memiliki sesuatu yang unik. Static method hanya bisa diakses melalui classnya saja.
Contoh
class Program
{
static void contohmethod()
{
Console.WriteLine(“Method Tanpa Parameters”);
}
static void contohmethod(int value1,int value2)
{
Console.WriteLine(“Nilai dari parameter1 ” + value1.ToString() );
Console.WriteLine(“Nilai dari parameter2 ” + value2.ToString());
}
static void contohmethod(ref int value)
{
value = value + 9;
Console.WriteLine(“Nilai Parameters dengan metoda Ref ” + value.ToString() );
}
static void Main(string[] args)
{
contohmethod();
int v1 = 10;
int v2 = 20;
contohmethod(v1, v2);
int r = 10;
contohmethod(ref r);
Console.ReadLine();
}
}
6.2 non static method
non static method adalah method yang dapat diakses melalui instance-nya
contoh :
class First
{
public virtual void one()
{
Console.WriteLine(“Class First One”);
}
}
class Second : First
{
public override void one()
{
Console.WriteLine(“Class Second One”);
}
}
class Program
{
static void Main(string[] args)
{
First x = new First() ;
Second y = new Second() ;
x.one();
y.one();
Console.ReadLine();
}
}
Object Oriented Programming using C#
Pengantar OOPAplikasi berbasis windows dan web adalah program yang sangat kompleks yang menyajikan tampilan menarik kepada user dan menawarkan user interface yang kompleks dengan tombol, dropdown, popup menu, toolbox, dan masih banyak komponen yang lain. Dibelakang user interface tersebut masih ada hubungan bussiness prosess yang kompleks seperti misal hubungan antara Product, Customer, dan Order yang melibatkan banyak logika dan pengolahan data.
Untuk menangani berbagai kompleksitas yang terjadi maka programmer mengembangkan teknik yang diberi nama “Objcet Oriented Programming”, dengan tujuan yang sederhana yaitu mengatur kompleksitas dengan memodelkan aspek esensial yang ada. Jika model yang dikembangkan semakin mendekati problem yang akan dipecahkan maka semakin mudah *** persoalan tersebut dapat dimengerti sehingga program lebih mudah ditulis dan di-maintain.
Problem yang akan dipecahkan dan semua informasi yang berhubungan dengan problem tersebut sering disebut sebagai problem domain. Misal jika anda ingin membuat program untuk keperluan Inventory dan Sales di suatu perusahaan maka problem domainnya adalah semua informasi tentang perusahaan tersebut yang berhubungan dengan pengaturan stok inventory, cara penjualan, pemasukan penjualan dan data lainnya. Manaager penjualan dan Manager bagian gudang akan menjadi problem domain expert yang dapat membantu anda dalam menyelesaikan masalah.
Design dari Object Oriented harus berisi objek-objek yang ada pada problem domain tersebut. Sebagai contoh jika problem domainnya adalah mesin ATM maka objek didalamnya seharusnya adalah customer, rekening, dll.
Class vs Object
Apa sich bedanya?. Jika anda ingin membangun rumah Class adalah blueprint / gambar (berisi spesifikasi lengkap dari rumah yang akan dibuat, ukuran, jumlah, dll). Sedangkan object adalah bentuk fisik / rumah yang dibangun berdasarkan blueprint / class yang sudah ada, biasa disebut instan class / object.
Elemen Pada Class
Class pada C# terdiri dari :
· Instance Variable / Field
· Method
Method digunakan untuk merubah state pada field.
Mendefinisikan Class
Class di C# dapat terdiri dari kumpulan variable (field), property dan method. Cara untuk menggunakan class adalah dengan membuat instan class-nya. Untuk menjalankan class maka harus ada satu method main pada class tersebut. contoh pendeklarasian class di C# sebagai berikut:
1: public class Time
2: {
3: // private variables atau field
4: private int year;
5: private int month;
6: private int date;
7: private int hour;
8: private int minute;
9: private int second;
10:
11: // public methods
12: public void DisplayCurrentTime()
13: {
14: Console.WriteLine(“Menampilkan Waktu..”);
15: }
16: }
17:
18: class Program
19: {
20: static void Main(string[] args)
21: {
22: Time timeObject = new Time(); //membuat instan class
23: timeObject.DisplayCurrentTime(); //memanggil method dalam class
24: }
25: }
C# Modifier
C# memiliki beberapa modifier class yaitu:
Access Modifiers
Access Modifiers digunakan untuk menentukan hak akses dari class dan method, adapun access modifier yang ada pada C# sebagai berikut:
Method Arguments
Method pada C# dapat memiliki banyak argumen dengan tipe data yang berbeda. Method juga dapat memiliki nama yang sama asal parameter / tipe datanya berbeda (Method Overloading).
1: class MyClass {
2: public void SomeMethod(int firstParam, double secondParam) {
3: Console.WriteLine(“Parameter 1 : {0} dan parameter 2 : {1}”,
4: firstParam, secondParam);
5: }
6:
7: //overload method
8: public void SomeMethod(int firstParam) {
9: Console.WriteLine(“Parameter 1 : {0}”, firstParam);
10: }
11:
12: public void SomeMethod(int firstParam, string secondParam) {
13: Console.WriteLine(“Parameter 1 : {0} dan parameter 2 : {1}”,
14: firstParam, secondParam);
15: }
16: }
17:
18: class MethodArgumen {
19: static void Main(string[] args) {
20: MyClass m1 = new MyClass(); //membuat instan object
21: m1.SomeMethod(12, 1.25);
22: m1.SomeMethod(34);
23: m1.SomeMethod(12, “Hello”);
24: }
25: }
Konstruktor
Konstruktor adalah method yang namanya sama dengan nama class-nya. Konstruktor digunakan untuk inisialisasi variabel ketika membuat instan class / objek baru. Sebenarnya setiap kali anda membuat instant class / objek baru maka konstruktor dijalankan. Jika anda tidak mendefinisikan konstruktor secara eksplisit maka tetap dianggap membuat konstruktor kosong.
Konstruktor juga dapat di-overload (anda dapat membuat konstruktor lebih dari satu asal parameternya jumlahnya beda atau tipe datanya beda). Variabel dalam class harus diinisialisasi, nilai defaultnya adalah
1: public class Time {
2: // private member variables
3: int Year;
4: int Month;
5: int Date;
6: int Hour;
7: int Minute;
8: int Second;
9:
10: // constructor
11: public Time(System.DateTime dt) {
12: Year = dt.Year;
13: Month = dt.Month;
14: Date = dt.Day;
15: Hour = dt.Hour;
16: Minute = dt.Minute;
17: Second = dt.Second;
18: }
19:
20: // public methods
21: public void DisplayCurrentTime() {
22: System.Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”,
23: Month, Date, Year, Hour, Minute, Second);
24: }
25:
26: }
27:
28: class LatKonstruktor {
29: public static void Main(string[] args) {
30: DateTime currTime = DateTime.Now;
31: Time t = new Time(currTime); //memanggil constructor
32: t.DisplayCurrentTime();
33: }
34: }
Initializer
Pada C# anda bisa menginisialisasi variabel dalam class secara langsung tanpa harus mengisialisasi-nya lewat konstruktor.
1: public class Time
2: {
3: // private member variables
4: int year;
5: int month;
6: int date;
7: int hour;
8: int minute;
9: int second = 30; //initializer
10: }
“This” Keyword
This keyword digunakan untuk mengakses instan class / objek itu sendiri, penggunaan keyword this diperlukan untuk membedakan pengaksesan class variabel dan method variabel yang mempunyai nama yang sama.
1: public class Time {
2: // private member variables, class variable
3: int year;
4: int month;
5: int date;
6: int hour;
7: int minute;
8: int second = 30;
9:
10: public void SetTime(year, month, date, newHour, newMinute, newSecond) {
11: this.year = year; // penggunaan “this” dibutuhkan
12: this.month = month; // dibutuhkan
13: this.date = date; // dibutuhkan
14: this.hour = hour; // penggunaan “this” optional
15: this.minute = newMinute; // optional
16: second = newSecond; // optional
17: }
18: }
Static dan Instance Member
Field, property, dan method dalam suatu class bisa merupakan instance member atau static member. Instance member dibentuk ketika class tersebut dibuat instan-nya, secara default field, property, dan method yang tidak diberi keyword static merupakan instance member.
Static member tidak berhubungan dengan instan class melainkan langsung berhubungan dengan class tersebut. Dengan menggunakan keyword static anda dapat mengakses field, property, atau method pada suatu class tanpa harus membuat instan class-nya.
1: public class Kucing {
2: private static int instances = 0;
3: public Kucing() {
4: instances++;
5: }
6: public static void BanyakKucing() {
7: Console.WriteLine(“Banyak Kucing : {0}”, instances);
8: }
9: }
10:
11: class StaticMember {
12: public static void Main(string[] args) {
13: Kucing meong1 = new Kucing();
14: Kucing.BanyakKucing();
15: Kucing meong2 = new Kucing();
16: Kucing meong3 = new Kucing();
17: Kucing.BanyakKucing();
18: }
19: }
Destroy Object
Karena C# menyediakan garbage collector, anda tidak perlu secara eksplisit men-destroy objek. Jika anda bekerja dengan unmanage resource (kode yang tidak di handle oleh CLR) maka anda tetap harus mendestroy objek secara manual. Adapun cara pendeklarasian destruktor pada C# sebagai berikut:
1: ~MyClass( ){
2: // perintah disini
3: }
Jika anda menggunakan managed code pada C# maka anda tidak diperbolehkan untuk mendestroy object secara langsung karena pada managed code, destroy object sudah diatur oleh komponen garbage collector pada CLR. Untuk men-destroy objek secepat mungkin setelah tidak diperlukan lagi anda dapat menggunakan interface IDisposable.
1: class Testing : IDisposable {
2: bool is_disposed = false;
3: protected virtual void Dispose(bool disposing) {
4: if (!is_disposed) { //hanya sekali dispose
5: if (disposing) {
6: Console.WriteLine(
7: “Sudah di dispose tanpa masuk ke desktruktor”);
8: }
9: //bersihkan objectnya disini
10: Console.WriteLine(“Disposing…”);
11: }
12: this.is_disposed = true;
13: }
14:
15: public void Dispose() {
16: Dispose(true);
17: GC.SuppressFinalize(this);
18: }
19:
20: ~Testing(){
21: Dispose(false);
22: Console.WriteLine(“Didalam destruktor”);
23: }
24: }
25:
26: class LatDispose {
27: public static void Main(string[] args) {
28: Testing t1 = new Testing();
29: t1.Dispose();
30: }
31: }
Menggunakan Using Statement
Untuk memudahkan developer C# menyediakan statement using untuk memastikan bahwa method dispose dijalankan. (kadang kita lupa untuk memanggil method dispose ini). Penggunaan using hanya bisa digunakan untuk class yang mengimplementasikan IDisposable.
1: class LatDispose {
2: public static void Main(string[] args) {
3: using (Testing t1 = new Testing()) {
4: Console.WriteLine(“Menggunakan Keyword Using..”);
5: }
6: }
7: }
Passing Parameter
Parameter pada C# secara default yang dikirimkan kedalam method adalah nilainya, atau “pass by value”. Jadi jika ada perubahan nilai parameter pada method tersebut tidak berpengaruh ke method.
1: public class Time {
2: // private member variables
3: private int Year;
4: private int Month;
5: private int Date;
6: private int Hour;
7: private int Minute;
8: private int Second;
9:
10: public void DisplayCurrentTime() {
11: System.Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”,
12: Month, Date, Year, Hour, Minute, Second);
13: }
14:
15: public int GetHour() {
16: return Hour;
17: }
18:
19: public void GetTime(int h, int m, int s) {
20: h = Hour;
21: m = Minute;
22: s = Second;
23: }
24:
25: public Time(System.DateTime dt) { //konstruktor
26: Year = dt.Year;
27: Month = dt.Month;
28: Date = dt.Day;
29: Hour = dt.Hour;
30: Minute = dt.Minute;
31: Second = dt.Second;
32: }
33:
34: class MethodByReference {
35:
36: public static void Main(string[] args) {
37: System.DateTime currentTime = System.DateTime.Now;
38: Time t = new Time(currentTime);
39: t.DisplayCurrentTime();
40:
41: int theHour = 0;
42: int theMinute = 0;
43: int theSecond = 0;
44: t.GetTime(theHour, theMinute, theSecond);
45: System.Console.WriteLine(“Current time: {0}:{1}:{2}”,
46: theHour, theMinute, theSecond);
47: }
48: }
49: }
Jika ingin mengirimkan parameter referenced / ‘pass by reference’ anda dapat menambahkan keyword ref sebelum tipe data pada method parameternya.
1: //tambahkan keyword ref pada parameter
2: public void GetTime(ref int h,ref int m,ref int s) {
3: h = Hour;
4: m = Minute;
5: s = Second;
6: }
7:
8: //pada method main tambahkan ref pada method pemanggil
9: int theHour = 0;
10: int theMinute = 0;
11: int theSecond = 0;
12: t.GetTime(ref theHour, ref theMinute, ref theSecond);
13: System.Console.WriteLine(“Current time: {0}:{1}:{2}”,
14: theHour, theMinute, theSecond);
Overloading Konstruktor & Method
Pada C# anda dapat mendeklarasikan method atau konstruktor dengan nama yang sama pada sebuah class, tetapi parameter method tersebut harus berbeda bisa jumlah atau tipe datanya. Pada contoh dibawah ini akan ditunjukan bagaimana cara menggunakan overloading konstruktor
1: public class Time
2: {
3: // private member variables
4: private int Year;
5: private int Month;
6: private int Date;
7: private int Hour;
8: private int Minute;
9: private int Second;
10:
11: // public accessor methods
12: public void DisplayCurrentTime()
13: {
14: System.Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”,
15: Month, Date, Year, Hour, Minute, Second);
16: }
17: // constructors
18: public Time(System.DateTime dt)
19: {
20: Year = dt.Year;
21: Month = dt.Month;
22: Date = dt.Day;
23: Hour = dt.Hour;
24: Minute = dt.Minute;
25: Second = dt.Second;
26: }
27: public Time(string strTime) // overloading konstruktor
28: {
29: Console.WriteLine(strTime);
30: }
31:
32: public Time(int Year, int Month, int Date,
33: int Hour, int Minute, int Second) // overloading konstruktor
34: {
35: this.Year = Year;
36: this.Month = Month;
37: this.Date = Date;
38: this.Hour = Hour;
39: this.Minute = Minute;
40: this.Second = Second;
41: }
42: }
43:
44: class Tester
45: {
46: public void Run()
47: {
48: System.DateTime currentTime = System.DateTime.Now;
49: Time time1 = new Time(currentTime);
50: time1.DisplayCurrentTime();
51: Time time2 = new Time(2000, 11, 18, 11, 03, 30);
52: time2.DisplayCurrentTime();
53: }
54:
55: static void Main()
56: {
57: Tester t = new Tester();
58: t.Run();
59: }
60: }
Selain konstruktor overloading juga bisa diterapkan pada method dalam suatu class yang sama, contoh penulisannya:
1: void MyMethod(int p1);
2: void MyMethod(int p1, int p2); // beda banyak parameter
3: void MyMethod(int p1, string s1); // beda tipe data
Enkapsulasi data dengan Property
Enkapsulasi / penyembunyian informasi adalah konsep yang selama ini sering anda dengar. Pada OOP informasi dibungkus dalam sebuah Class sehingga orang yang menggunakan class tersebut tidak perlu tahu detail-nya, hanya cukup mengetahui method dan property apa saja yang ada dalam class tersebut beserta kegunaannya.
Pada pemrograman berorientasi objek variabel dalam class biasanya diberi access modifier private, ini berarti hanya method dalam class tersebut yang dapat mengakses variabelnya. Yang menjadi pertanyaan bagaimana cara anda mengakses variabel bertipe private tersebut? Mengapa harus dibuat private?
Jika anda membuat variable tersebut public maka user yang menggunakan class tersebut bisa memasukan nilai yang tidak kita inginkan, maka anda harus mendeklarasikan variable tersebut secara private agar pada saat setMethod() anda dapat menambahkan validasi inputan dari user.
Anda bisa membuat public method set dan get untuk memberi dan mengambil nilai variabel tersebut, misal:
1: // private member variables
2: private int Year;
3:
4: public int getYear() //get method
5: {
6: return this.Year;
7: }
8:
9: public void setYear(int Year) //set method
10: {
11: this.Year = Year;
12: }
Selain menggunakan cara tersebut diatas pada C# disediakan object property untuk memberi nilai dan mengambil nilai dari private variabel dalam suatu class. Penggunaan object property lebih memudahkan anda dalam penulisan kode dibandingkan harus membuat dua method set dan get untuk mengakses satu variabel private. Contoh penggunaan property dapat dilihat pada contoh kode dibawah ini.
1: class Mahasiswa {
2: private string nim;
3: private string nama;
4:
5: public string Nim {
6: get {
7: return nim;
8: }
9: set {
10: this.nim = value;
11: }
12: }
13:
14: public string Nama {
15: get {
16: return nama;
17: }
18: set {
19: this.nama = value;
20: }
21: }
22:
23: public string DisplayInfo() {
24: return Nim + ” ” + Nama;
25: }
26: }
27:
28: class ClassProperty {
29: public static void Main(string[] args) {
30: Mahasiswa mhs1 = new Mahasiswa();
31: mhs1.Nim = “22002321″;
32: mhs1.Nama = “Erick”;
33: Console.WriteLine(mhs1.DisplayInfo());
34: }
35: }
Get Accessor
Penggunakan get{} pada property mirip dengan jika anda menggunaan method getValue() / getter method pada java, get pasti mengembalikan nilai jadi dalam kalang get harus ada return valuenya.
Set Accessor
Penggunaan set{} pada property mirip dengan jika anda menggunakan setValue() / setter method pada java, set digunakan untuk memberi nilai kedalam class variable. Pada C# jika anda memberi nilai pada property maka set{} otomatis dijalankan.
Specialization dan Generalization
Class dan instannya (objek) tidak berdiri sendiri, seperti objek manusia yang merupakan mahluk sosial tidak hanya berdiri sendiri, objek akan saling berelasi dan berinteraksi, demikian *** pada OOP.
Salah satu hubungan antar objek yang paling penting yang terjadi di dunia nyata adalah spesialisasi yang bisa didefinisikan sebagai is-a relationship, misal anjing adalah mamalia, jika anjing termasuk anggota mamalia maka dia memiliki ciri-ciri special khas yaitu menyusui, punya bulu. Selain sifat-sifat pada mamalia anjing juga memiliki ciri yang spesifik khas anjing yang tidak dipunyai anggota mamalia lainnya seperti kucing.
Relasi spesialisasi dan generalisasi terjadi pada contoh diatas, anjing dan kucing secara general merupakan anggota mamalia tetapi juga terspesialisasi secara spesifik sebagai anjing dan kucing yang mempunyai ciri khas yang berbeda. Relasi tersebut dapat digambarkan secara hirarki.
Inheritance
Pada C# hubungan spesialisasi diimplementasikan menggunakan prinsip inheritance. Penulisan inheritance di C# sebagai berikut
public class ListBox : Window
Kode diatas berarti class ListBox adalah turunan dari class Window
Penggunaan inheritance dapat dilihat pada program dibawah ini
1: public class Window {
2: //variabel dideklarasikan private sehingga tidak bisa diakses oleh kelas
3: //turunannya
4: private int top;
5: private int left;
6:
7: //objek konstruktor
8: public Window(int top, int left) {
9: this.top = top;
10: this.left = left;
11: }
12:
13: public void DrawWindow() {
14: Console.WriteLine(“Draw window pada ({0},{1})”,
15: top, left);
16: }
17: }
18:
19: public class ListBox : Window {
20: //member variable baru pada class anak
21: private string listBoxContent;
22: public ListBox(int top, int left, string contents):base(top,left) {
23: this.listBoxContent = contents;
24: }
25:
26: //versi baru karena override dari base classnya
27: public new void DrawWindow() {
28: base.DrawWindow();
29: Console.WriteLine(“Menuliskan string pada listbox: {0}”,
30: listBoxContent);
31: }
32: }
33:
34: class LatInheritance {
35: public static void Main(string[] args) {
36: Window objWindow = new Window(10, 15);
37: objWindow.DrawWindow();
38:
39: ListBox objList = new ListBox(15, 20, “Hello ListBox”);
40: objList.DrawWindow();
41: }
42: }
Memanggil Base Class Constructor
Pada contoh diatas class ListBox adalah turunan dari class Window, class ListBox mempunyai konstruktornya sendiri yang memiliki tiga parameter, konstruktor pada class ListBox dapat menggunakan tanda : (titik dua) untuk memanggil kosntruktor base class-nya (konstruktor pada class Window)
public ListBox(int top, int left, string theContents):base(top, left)
Karena konstruktor tidak dapat diturunkan maka class turunan harus memiliki konstruktor sendiri.
Polymorphism
Ada dua aspek yang paling penting pada inheritance yang pertama adalah code reuse, sebagai contoh ketika anda membuat class ListBox maka anda dapat menggunakan logic yang sudah dibuat pada class Window
Aspek kedua yang tidak kalah penting dari inheritance adalah polymorhism, poly berarti banyak dan morph berarti bentuk, jadi polymorphism dapat berarti dapat menggunakan banyak bentuk tanpa harus mengacu details yang sama.
Dari istilahnya Polymorphism kesannya sulit dan kompleks, tetapi sebenarnya simple, ilustrasinya begini ketika sebuah perusahaan telpon / provide telpon mengirimkan signal ke anda (dering telpon), mereka tidak tahu telpon apa yang anda gunakan, bisa model lama dengan dering kuno, bisa HP dengan dering music mp3, TV Phone, PDA Phone dll. yang provider tahu bahwa masing-masing telepon mempunyai ‘base type’ telepon dan mempunyai method untuk berdering. Ketika provider mengirimkan signal mereka hanya berharap bahwa telepon akan berdering tidak peduli jenis telponnya, nah provider telepon memperlakukan telepon anda secara polymorphism.
Membuat Type Polymorphism
Dari gambar diatas dapat anda lihat, ListBox is-a Control (karena ListBox turunan dari Control), Button is-a Control, kita berharap bahwa dapat memperlakukan keduanya sebagai Control. Misal anda mempunyai banyak control di collection untuk digambar ke windows, dan mengharapkan ketika memanggil method draw() pada control maka control2 tersebut akan tergambar sesuai dengan tipe objectnya (mis: ListBox, RadioButton, Command, dll).
Anda dapat mengimplementasikan polymorphism dengan dua cara yaitu:
- Membuat virtual method pada base class (class induk)
- Membuat class turunan yang mempunyai method dengan keyword override yang mengganti isi dari method dengan keyword virtual yang ada pada base class-nya.
1: public class Control {
2: //variabel dideklarasikan private sehingga tidak bisa diakses oleh kelas
3: //turunannya
4: private int top;
5: private int left;
6:
7: protected int Top {
8: get {
9: return this.top;
10: }
11: set {
12: this.top = value;
13: }
14: }
15:
16: protected int Left {
17: get {
18: return this.left;
19: }
20: set {
21: this.left = value;
22: }
23: }
24:
25: //objek konstruktor
26: public Control(int top, int left) {
27: Top = top;
28: Left = left;
29: }
30:
31: public virtual void DrawWindow() {
32: Console.WriteLine(“Draw window pada ({0},{1})”,
33: top, left);
34: }
35:
36: }
37:
38: public class ListBox : Control {
39: //member variable baru pada class anak
40: private string listBoxContent;
41: public ListBox(int top, int left, string contents)
42: : base(top, left) {
43: this.listBoxContent = contents;
44: }
45:
46: //versi baru karena override dari base classnya
47: public override void DrawWindow() {
48: base.DrawWindow();
49: Console.WriteLine(“Menuliskan string pada listbox: {0}”,
50: listBoxContent);
51: }
52:
53: }
54:
55: public class Button : Control {
56: public Button(int top, int left) : base(top, left) {}
57:
58: public override void DrawWindow() {
59: //base.DrawWindow();
60: Console.WriteLine(“Menggambar button pada ({0},{1})”, Top, Left);
61: }
62: }
63: class LatPolymophism {
64: static void Main(string[] args) {
65: Control win = new Control(10, 15);
66: ListBox lstBox = new ListBox(5, 10, “Text pada ListBox”);
67: Button b = new Button(5, 6);
68: win.DrawWindow();
69: lstBox.DrawWindow();
70: b.DrawWindow();
71:
72: Control[] winArray = new Control[3];
73: winArray[0] = new Control(10, 15);
74: winArray[1] = new ListBox(5, 10, “Pada ListBox”);
75: winArray[2] = new Button(5, 6);
76:
77: for (int i = 0; i < 3; i++) {
78: winArray.DrawWindow();
79: }
80: }
81: }
Dapat dilihat dari contoh diatas bahwa base class yaitu Window mempunyai method yang bernama DrawWindow() yang mempunyai keyword virtual, ini berarti method tersebut dapat di override atau diganti implementasinya dengan method yang nama dan parameternya sama persis di kelas turunannya yaitu class ListBox.
Versioning dengan new dan override keyword
Pada contoh diatas digunakan keyword virtual pada base class agar dapat dioverride oleh class turunannya. Akan timbul masalah jika misal: Perusahan A membuat class Control kemudian perusahaan B membelinya untuk membuat ListBox dan RadioButton (tapi B tidak bisa memodifikasi class Control karena hanya beli tanpa code), pada saat membuat ListBox perusahaan B menambahkan fungsi sort() kedalam class tersebut
1: public class ListBox : Control
2: {
3: public virtual void Sort( ) {…}
4: }
Hal diatas tidak menjadi masalah sampai perusahaan A menambahkan method sort() juga dalam class Control:
1: public class Control
2: {
3: // …
4: public virtual void Sort( ) {…}
5: }
Maka akan menjadi rancu karena ada dua method dengan nama yang sama ketika anda akan memanggil method sort dari class turunan ListBox, tidak bisa dibedakan mana method sor() pada Control atau ListBox, untuk menangani masalah ini C# menyediakan keyword new.
1: public class ListBox : Control
2: {
3: public new virtual void Sort( ) {…}
4: }
Abstract Class
Setiap tipe Window pasti mempunyai bentuk tampilan yang berbeda misal combobox, listbox, button, dll. Berarti setiap class turunan dari Window harus mempunyai method DrawWindow() nya sendiri yang berbeda satu sama lain. Untuk memastikan bahwa setiap class turunan Control harus mempunyai method DrawWindow() maka anda harus mendefinisikan class tersebut sebagai abstract class dan memiliki method abstract yang belum diimplementasikan.
Abstract method tidak mempunyai implementation, abstract method hanya semacam kontrak yang harus dipenuhi. Semua class yang diturunkan dari class yang mempunyai abstract method harus mengimplementasikan method tersebut.
Class yang didefinisikan sebagai abstract class tidak dapat dibuat instan class / objek, class yang didefinisikan abstract hanya dapat digunakan dengan cara diturunkan.
1: public abstract class Control {
2: private int top;
3: private int left;
4:
5: protected int Top {
6: get { return this.top;}
7: set { this.top = value;}
8: }
9: protected int Left {
10: get {return this.left;}
11: set {this.left = value;}
12: }
13: public Control(int top, int left) {
14: Top = top;
15: Left = left;
16: }
17: //abstract method harus diimplementasikan
18: public abstract void DrawWindow();
19: }
20:
21: public class ListBox : Control {
22: private string listBoxContent;
23: public ListBox(int top, int left, string contents)
24: : base(top, left) {
25: this.listBoxContent = contents;
26: }
27:
28: public override void DrawWindow() {
29: Console.WriteLine(“Position {0},{1})”, Top, Left);
30: Console.WriteLine(“Menuliskan string pada listbox: {0}”,
31: listBoxContent);
32: }
33:
34: }
35:
36: public class Button : Control {
37: public Button(int top, int left) : base(top, left) { }
38: public override void DrawWindow() {
39: Console.WriteLine(“Menggambar button pada ({0},{1})”, Top, Left);
40: }
41: }
42: class LatAbstract {
43: static void Main(string[] args) {
44: Control[] winArray = new Control[3];
45: winArray[0] = new ListBox(5, 10, “Pada ListBox”);
46: winArray[1] = new Button(5, 6);
47: for (int i = 0; i < 2; i++) {
48: winArray.DrawWindow();
49: }
50: }
51: }
Tapi untuk kasus diatas abstract masih mempunyai keterbatasan, jika anda ingin membuat class DropDownList yang hendak diturunkan dari class ListBox, maka anda tidak dapat memaksakan method DrawWindow() harus ada di class tersebut.
Sealed Class
Jika anda ingin membuat class yang tidak dapat diturunkan lagi maka anda dapat menambahkan keyword ‘sealed’.
Object Root dari semua class
Semua class dari semua type diturunkan dari satu class untama yaitu class object. Meskipun tidak dituliskan secara eksplisit namun pada dasarnya semua class diturunkan dari class object.
Beberapa method yang ada pada class object adalah: Equals(), GetHashCode(), GetType(), ToString(), Finalize(), MemberwiseClone(), ReferenceEquals().
Method dari class yang ada diatas dapat dioverride oleh semua class karena pada dasarnya semua class diturunkan dari class object.
1: public class Cat {
2: private int weight;
3: public Cat(int weight) {
4: this.weight = weight;
5: }
6:
7: public override string ToString() {
8: return weight.ToString();
9: }
10: }
11: class LatObject {
12: static void Main(string[] args) {
13: Cat catty = new Cat(60);
14: Console.WriteLine(“Berat si catty : ” + catty);
15: }
16: }
Boxing dan Unboxing Types
Boxing dan Unboxing adalah suatu proses ketika suatu tipe data value (seperti int) di konversikan menjadi tipe reference / object. Istilah boxing berarti diubah menjadi object dan unboxing berarti dikembalikan lagi ke tipe data value.
Proses boxing dilakukan secara implisit jadi compiler otomatis akan melakukannya ketika kita mengisi nilai bertipe value kedalam variabel bertipe object.
1: int myIntegerValue = 5;
2: object myObject = myIntegerValue; // cast to an object
3: myObject.ToString();
Tidak seperti boxing, proses unboxing harus eksplisit. Ketika proses unbox kita harus tahu tipe data apa yang kita ingin konversikan dari tipe objek-nya.
1: int myInt = 123;
2: //proses boxing (dilakukan secara otomatis)
3: object objInt = myInt;
4: Console.WriteLine(“Nilai ObjInt : {0}”,objInt.ToString());
5:
6: //proses unboxing (harus dilakukan secara eksplisit)
7: myInt = (int)objInt;
8: Console.WriteLine(“Nilai myInt : {0}”, myInt.ToString());
Menghindari Boxing dan unboxing dengan Generic
Proses boxing dan unboxing mempengaruhi performa program, karena semua harus di boxing kedalam tipe object (misal: dalam penggunaan ArrayList). Pada C# 2.0 keatas sudah mendukung generic sehingga proses boxing dan unboxing dapat dihindari.
Interfaces
Jika anda ingin mendefinisikan tipe baru tetapi tidak ingin mengimplementasikan isinya secara langsung maka anda dapat menggunakan interfaces.
Pada dasarnya interface adalah sebuah kontrak, ketika anda mendesign interface seolah-olah anda mengatakan “jika anda ingin menggunakan class ini maka anda harus mengimplementasikan method, property yang sudah disediakan”. Class yang menggunakan interface tersebut setuju dengan kontrak dan mengimplementasikan requirement yang ditentukan.
Dibandingkan dengan abstract class, abstract class hanya bisa digunakan di class paling atas ‘top-hierarchy’ sedangkan interface dapat digunakan di setiap class yang diinginkan (setiap class dapat mengimplementasikan lebih dari satu interface).
Perbedaan Interface dan Abstract Class
Programmer sering merasa bingung dalam mebedakan Interface dan Abstract Class. Beberapa perbedaannya adalah:
- Cara penggunaan Abstract Class adalah diturunkan, sedangkan cara penggunaan Interface adalah diimplementasikan.
- Pada C# lambang untuk menurunkan class dan menggunakan interfaces sama-sama menggunakan tanda “:” (titik dua). Tetapi untuk membedakan biasanya nama interface diawali dengan huruf I di depan misal: IEnumerable, IDisposable, dll.
- Sebuah class hanya dapat diturunkan dari satu abstract class tapi dapat menggunakan lebih dari satu interfaces.
- Method dan member variable pada abstract class boleh sudah ada isinya, sedangkan pada interfaces semua belum ada implementasinya.
- Pada Abstract Class semua method / member variable yang abstract harus diimplementasikan di class turunannya.
- Pada Interface semua member variable dan method harus diimplementasikan di class yang menggunakan interface tersebut.
- Access Modifier pada method dan member variable di Interface secara implisit adalah public.
2: void Read();
3: void Write();
4: int Status { get; set; }
5: }
6:
7: public class Document : IStorable {
8: private int status = 0;
9:
10: public Document(string s) {
11: Console.WriteLine(“Create : {0}”, s);
12: }
13:
14: public void Read() {
15: Console.WriteLine(“Mengimplementasikan method Read dari IStorable”);
16: }
17:
18: public void Write() {
19: Console.WriteLine(“Mengimplementasikan method Write dari IStorable”);
20: }
21:
22: public int Status {
23: get { return this.status; }
24: set { this.status = value; }
25: }
26: }
27:
28: class LatSimpleInterface {
29: static void Main(string[] args) {
30: Document doc = new Document(“New Document”);
31: doc.Read();
32: doc.Write();
33: doc.Status = 1;
34: Console.WriteLine(“Document status : {0}”, doc.Status);
35: }
36: }
Mengimplementasikan lebih dari satu Interface
Pada C# sebuah class hanya dapat diturunkan dari sebuah class saja, tidak seperti bahasa C++ yang mendukung multipe inheritance. Tetapi untuk interface anda dapat menggunakan lebih dari satu interface dalam sebuah class.
Misal saja untuk class dokumen diatas dapat disimpan dan dapat juga dikompres datanya, maka anda dapat menambahkan interface Icompressible kedalam class tersebut.
Interface juga dapat dikombinasikan, anda bisa menambahkan inteface kedalam interface lain, misal:
1: interface ICompessible {
2: void Compress();
3: void Decompress();
4: }
5: interface ILoggedCompresible : ICompessible {
6: void LogSavedBytes();
7: }
Ketika anda menggunakan interface IloggedCompresible maka anda harus mengimplementasikan method Compress(), Decompress(), dan LogSavedBytes().
1: interface IStorable {
2: void Read();
3: void Write(object obj);
4: int Status { get; set; }
5: }
6:
7: interface ICompressible {
8: void Compress();
9: void Decompress();
10: }
11:
12: interface ILoggedCompressible : ICompressible {
13: void LogSavedBytes();
14: }
15:
16: interface IStorableCompressible : IStorable, ILoggedCompressible{
17: void LogOriginalSize();
18: }
19:
20: interface IEncryptable {
21: void Encrypt();
22: void Decrypt();
23: }
24:
25: public class Document : IStorableCompressible, IEncryptable {
26: private int status = 0;
27:
28: public Document(string s) {
29: Console.WriteLine(“Creating Document: {0}”, s);
30: }
31:
32: public void LogOriginalSize() {
33: Console.WriteLine(“Mengimplementasikan method LogOriginalSize”);
34: }
35:
36: public void Read() {
37: Console.WriteLine(“Mengimplementasikan method Read”);
38: }
39:
40: public void Write(object obj) {
41: Console.WriteLine(“Mengimplementasikan method Write”);
42: }
43:
44: public int Status {
45: get { return status; }
46: set { this.status = value; }
47: }
48:
49: public void LogSavedBytes() {
50: Console.WriteLine(“Mengimplementasikan method LogSavedBytes”);
51: }
52:
53: public void Compress() {
54: Console.WriteLine(“Mengimplementasikan method Compress”);
55: }
56:
57: public void Decompress() {
58: Console.WriteLine(“Mengimplementasikan method Decompress”);
59: }
60:
61: public void Encrypt() {
62: Console.WriteLine(“Mengimplementasilan method Encrypt”);
63: }
64:
65: public void Decrypt() {
66: Console.WriteLine(“Mengimplementasikan method Decrypt”);
67: }
68: }
69:
70: class LatMultipleInterface {
71: static void Main(string[] args) {
72: Document doc = new Document(“New Document”);
73: doc.Read();
74: doc.Compress();
75: doc.LogSavedBytes();
76: doc.LogOriginalSize();
77: doc.Encrypt();
78: doc.Decrypt();
79: doc.Decompress();
80: doc.Status = 1;
81: Console.WriteLine(“Status {0}”, doc.Status);
82: }
83: }
Delegates dan Event
Mungkin anda pernah menjumpai situasi dimana anda ingin mengeksekusi suatu action tetapi anda belum tahu pasti isi dari detail methodnya atau bahkan tidak tahu objectnya. Misal method untuk menghandle button press (ketika object button tersebut ditekan). Anda harus membayangkan bahwa pembuat komponen button, textbox, listbox bukanlah programmer yang menggunakan object tersebut. Pembuat button hanya tahu bahwa button tersebut mempunyai event click (ketika diklik) tapi pembuat buton tidak tahu apa yang terjadi ketika button tersebut diklik (hanya diketahui oleh programmer yang menggunakan button tersebut).
Untuk mengatasi masalah diatas pembuat button sudah menyediakan event misal click, mouse_mive, dll. jika programmer hendak menggunakannya maka dapat mengaksesnya menggunakan delegates. Delegates adalah semacam kontrak yang harus dipenuhi ketika hendak menggunakan method tertentu (mirip dengan interfaces).
1: delegate void StringProcesssor(string input);
2: class Person {
3: private string name;
4:
5: public Person(string name) {
6: this.name = name;
7: }
8:
9: public void Say(string message) {
10: Console.WriteLine(“{0} says : {1}”, name, message);
11: }
12: }
13:
14: class Background {
15: public static void Note(string note) {
16: Console.WriteLine(“({0}) “, note);
17: }
18: }
19:
20: class LatSimpleDelegates {
21: static void Main(string[] args) {
22: Person rick = new Person(“Erick”);
23: Person jhon = new Person(“Jhon”);
24: StringProcesssor jonsVoice, rickVoice, background;
25: rickVoice = new StringProcesssor(rick.Say);
26: jonsVoice = new StringProcesssor(jhon.Say);
27: background = new StringProcesssor(Background.Note);
28:
29: rickVoice(“Hello Jhon !!”);
30: jonsVoice(“Hello rick !!”);
31: background(“Suara ramai lalu lintas”);
32: }
33: }
Object Oriented Programming using C#
Pengantar OOPAplikasi berbasis windows dan web adalah program yang sangat kompleks yang menyajikan tampilan menarik kepada user dan menawarkan user interface yang kompleks dengan tombol, dropdown, popup menu, toolbox, dan masih banyak komponen yang lain. Dibelakang user interface tersebut masih ada hubungan bussiness prosess yang kompleks seperti misal hubungan antara Product, Customer, dan Order yang melibatkan banyak logika dan pengolahan data.
Untuk menangani berbagai kompleksitas yang terjadi maka programmer mengembangkan teknik yang diberi nama “Objcet Oriented Programming”, dengan tujuan yang sederhana yaitu mengatur kompleksitas dengan memodelkan aspek esensial yang ada. Jika model yang dikembangkan semakin mendekati problem yang akan dipecahkan maka semakin mudah *** persoalan tersebut dapat dimengerti sehingga program lebih mudah ditulis dan di-maintain.
Problem yang akan dipecahkan dan semua informasi yang berhubungan dengan problem tersebut sering disebut sebagai problem domain. Misal jika anda ingin membuat program untuk keperluan Inventory dan Sales di suatu perusahaan maka problem domainnya adalah semua informasi tentang perusahaan tersebut yang berhubungan dengan pengaturan stok inventory, cara penjualan, pemasukan penjualan dan data lainnya. Manaager penjualan dan Manager bagian gudang akan menjadi problem domain expert yang dapat membantu anda dalam menyelesaikan masalah.
Design dari Object Oriented harus berisi objek-objek yang ada pada problem domain tersebut. Sebagai contoh jika problem domainnya adalah mesin ATM maka objek didalamnya seharusnya adalah customer, rekening, dll.
Class vs Object
Apa sich bedanya?. Jika anda ingin membangun rumah Class adalah blueprint / gambar (berisi spesifikasi lengkap dari rumah yang akan dibuat, ukuran, jumlah, dll). Sedangkan object adalah bentuk fisik / rumah yang dibangun berdasarkan blueprint / class yang sudah ada, biasa disebut instan class / object.
Elemen Pada Class
Class pada C# terdiri dari :
· Instance Variable / Field
· Method
Method digunakan untuk merubah state pada field.
Mendefinisikan Class
Class di C# dapat terdiri dari kumpulan variable (field), property dan method. Cara untuk menggunakan class adalah dengan membuat instan class-nya. Untuk menjalankan class maka harus ada satu method main pada class tersebut. contoh pendeklarasian class di C# sebagai berikut:
1: public class Time
2: {
3: // private variables atau field
4: private int year;
5: private int month;
6: private int date;
7: private int hour;
8: private int minute;
9: private int second;
10:
11: // public methods
12: public void DisplayCurrentTime()
13: {
14: Console.WriteLine(“Menampilkan Waktu..”);
15: }
16: }
17:
18: class Program
19: {
20: static void Main(string[] args)
21: {
22: Time timeObject = new Time(); //membuat instan class
23: timeObject.DisplayCurrentTime(); //memanggil method dalam class
24: }
25: }
C# Modifier
C# memiliki beberapa modifier class yaitu:
Access Modifiers
Access Modifiers digunakan untuk menentukan hak akses dari class dan method, adapun access modifier yang ada pada C# sebagai berikut:
Method Arguments
Method pada C# dapat memiliki banyak argumen dengan tipe data yang berbeda. Method juga dapat memiliki nama yang sama asal parameter / tipe datanya berbeda (Method Overloading).
1: class MyClass {
2: public void SomeMethod(int firstParam, double secondParam) {
3: Console.WriteLine(“Parameter 1 : {0} dan parameter 2 : {1}”,
4: firstParam, secondParam);
5: }
6:
7: //overload method
8: public void SomeMethod(int firstParam) {
9: Console.WriteLine(“Parameter 1 : {0}”, firstParam);
10: }
11:
12: public void SomeMethod(int firstParam, string secondParam) {
13: Console.WriteLine(“Parameter 1 : {0} dan parameter 2 : {1}”,
14: firstParam, secondParam);
15: }
16: }
17:
18: class MethodArgumen {
19: static void Main(string[] args) {
20: MyClass m1 = new MyClass(); //membuat instan object
21: m1.SomeMethod(12, 1.25);
22: m1.SomeMethod(34);
23: m1.SomeMethod(12, “Hello”);
24: }
25: }
Konstruktor
Konstruktor adalah method yang namanya sama dengan nama class-nya. Konstruktor digunakan untuk inisialisasi variabel ketika membuat instan class / objek baru. Sebenarnya setiap kali anda membuat instant class / objek baru maka konstruktor dijalankan. Jika anda tidak mendefinisikan konstruktor secara eksplisit maka tetap dianggap membuat konstruktor kosong.
Konstruktor juga dapat di-overload (anda dapat membuat konstruktor lebih dari satu asal parameternya jumlahnya beda atau tipe datanya beda). Variabel dalam class harus diinisialisasi, nilai defaultnya adalah
1: public class Time {
2: // private member variables
3: int Year;
4: int Month;
5: int Date;
6: int Hour;
7: int Minute;
8: int Second;
9:
10: // constructor
11: public Time(System.DateTime dt) {
12: Year = dt.Year;
13: Month = dt.Month;
14: Date = dt.Day;
15: Hour = dt.Hour;
16: Minute = dt.Minute;
17: Second = dt.Second;
18: }
19:
20: // public methods
21: public void DisplayCurrentTime() {
22: System.Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”,
23: Month, Date, Year, Hour, Minute, Second);
24: }
25:
26: }
27:
28: class LatKonstruktor {
29: public static void Main(string[] args) {
30: DateTime currTime = DateTime.Now;
31: Time t = new Time(currTime); //memanggil constructor
32: t.DisplayCurrentTime();
33: }
34: }
Initializer
Pada C# anda bisa menginisialisasi variabel dalam class secara langsung tanpa harus mengisialisasi-nya lewat konstruktor.
1: public class Time
2: {
3: // private member variables
4: int year;
5: int month;
6: int date;
7: int hour;
8: int minute;
9: int second = 30; //initializer
10: }
“This” Keyword
This keyword digunakan untuk mengakses instan class / objek itu sendiri, penggunaan keyword this diperlukan untuk membedakan pengaksesan class variabel dan method variabel yang mempunyai nama yang sama.
1: public class Time {
2: // private member variables, class variable
3: int year;
4: int month;
5: int date;
6: int hour;
7: int minute;
8: int second = 30;
9:
10: public void SetTime(year, month, date, newHour, newMinute, newSecond) {
11: this.year = year; // penggunaan “this” dibutuhkan
12: this.month = month; // dibutuhkan
13: this.date = date; // dibutuhkan
14: this.hour = hour; // penggunaan “this” optional
15: this.minute = newMinute; // optional
16: second = newSecond; // optional
17: }
18: }
Static dan Instance Member
Field, property, dan method dalam suatu class bisa merupakan instance member atau static member. Instance member dibentuk ketika class tersebut dibuat instan-nya, secara default field, property, dan method yang tidak diberi keyword static merupakan instance member.
Static member tidak berhubungan dengan instan class melainkan langsung berhubungan dengan class tersebut. Dengan menggunakan keyword static anda dapat mengakses field, property, atau method pada suatu class tanpa harus membuat instan class-nya.
1: public class Kucing {
2: private static int instances = 0;
3: public Kucing() {
4: instances++;
5: }
6: public static void BanyakKucing() {
7: Console.WriteLine(“Banyak Kucing : {0}”, instances);
8: }
9: }
10:
11: class StaticMember {
12: public static void Main(string[] args) {
13: Kucing meong1 = new Kucing();
14: Kucing.BanyakKucing();
15: Kucing meong2 = new Kucing();
16: Kucing meong3 = new Kucing();
17: Kucing.BanyakKucing();
18: }
19: }
Destroy Object
Karena C# menyediakan garbage collector, anda tidak perlu secara eksplisit men-destroy objek. Jika anda bekerja dengan unmanage resource (kode yang tidak di handle oleh CLR) maka anda tetap harus mendestroy objek secara manual. Adapun cara pendeklarasian destruktor pada C# sebagai berikut:
1: ~MyClass( ){
2: // perintah disini
3: }
Jika anda menggunakan managed code pada C# maka anda tidak diperbolehkan untuk mendestroy object secara langsung karena pada managed code, destroy object sudah diatur oleh komponen garbage collector pada CLR. Untuk men-destroy objek secepat mungkin setelah tidak diperlukan lagi anda dapat menggunakan interface IDisposable.
1: class Testing : IDisposable {
2: bool is_disposed = false;
3: protected virtual void Dispose(bool disposing) {
4: if (!is_disposed) { //hanya sekali dispose
5: if (disposing) {
6: Console.WriteLine(
7: “Sudah di dispose tanpa masuk ke desktruktor”);
8: }
9: //bersihkan objectnya disini
10: Console.WriteLine(“Disposing…”);
11: }
12: this.is_disposed = true;
13: }
14:
15: public void Dispose() {
16: Dispose(true);
17: GC.SuppressFinalize(this);
18: }
19:
20: ~Testing(){
21: Dispose(false);
22: Console.WriteLine(“Didalam destruktor”);
23: }
24: }
25:
26: class LatDispose {
27: public static void Main(string[] args) {
28: Testing t1 = new Testing();
29: t1.Dispose();
30: }
31: }
Menggunakan Using Statement
Untuk memudahkan developer C# menyediakan statement using untuk memastikan bahwa method dispose dijalankan. (kadang kita lupa untuk memanggil method dispose ini). Penggunaan using hanya bisa digunakan untuk class yang mengimplementasikan IDisposable.
1: class LatDispose {
2: public static void Main(string[] args) {
3: using (Testing t1 = new Testing()) {
4: Console.WriteLine(“Menggunakan Keyword Using..”);
5: }
6: }
7: }
Passing Parameter
Parameter pada C# secara default yang dikirimkan kedalam method adalah nilainya, atau “pass by value”. Jadi jika ada perubahan nilai parameter pada method tersebut tidak berpengaruh ke method.
1: public class Time {
2: // private member variables
3: private int Year;
4: private int Month;
5: private int Date;
6: private int Hour;
7: private int Minute;
8: private int Second;
9:
10: public void DisplayCurrentTime() {
11: System.Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”,
12: Month, Date, Year, Hour, Minute, Second);
13: }
14:
15: public int GetHour() {
16: return Hour;
17: }
18:
19: public void GetTime(int h, int m, int s) {
20: h = Hour;
21: m = Minute;
22: s = Second;
23: }
24:
25: public Time(System.DateTime dt) { //konstruktor
26: Year = dt.Year;
27: Month = dt.Month;
28: Date = dt.Day;
29: Hour = dt.Hour;
30: Minute = dt.Minute;
31: Second = dt.Second;
32: }
33:
34: class MethodByReference {
35:
36: public static void Main(string[] args) {
37: System.DateTime currentTime = System.DateTime.Now;
38: Time t = new Time(currentTime);
39: t.DisplayCurrentTime();
40:
41: int theHour = 0;
42: int theMinute = 0;
43: int theSecond = 0;
44: t.GetTime(theHour, theMinute, theSecond);
45: System.Console.WriteLine(“Current time: {0}:{1}:{2}”,
46: theHour, theMinute, theSecond);
47: }
48: }
49: }
Jika ingin mengirimkan parameter referenced / ‘pass by reference’ anda dapat menambahkan keyword ref sebelum tipe data pada method parameternya.
1: //tambahkan keyword ref pada parameter
2: public void GetTime(ref int h,ref int m,ref int s) {
3: h = Hour;
4: m = Minute;
5: s = Second;
6: }
7:
8: //pada method main tambahkan ref pada method pemanggil
9: int theHour = 0;
10: int theMinute = 0;
11: int theSecond = 0;
12: t.GetTime(ref theHour, ref theMinute, ref theSecond);
13: System.Console.WriteLine(“Current time: {0}:{1}:{2}”,
14: theHour, theMinute, theSecond);
Overloading Konstruktor & Method
Pada C# anda dapat mendeklarasikan method atau konstruktor dengan nama yang sama pada sebuah class, tetapi parameter method tersebut harus berbeda bisa jumlah atau tipe datanya. Pada contoh dibawah ini akan ditunjukan bagaimana cara menggunakan overloading konstruktor
1: public class Time
2: {
3: // private member variables
4: private int Year;
5: private int Month;
6: private int Date;
7: private int Hour;
8: private int Minute;
9: private int Second;
10:
11: // public accessor methods
12: public void DisplayCurrentTime()
13: {
14: System.Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”,
15: Month, Date, Year, Hour, Minute, Second);
16: }
17: // constructors
18: public Time(System.DateTime dt)
19: {
20: Year = dt.Year;
21: Month = dt.Month;
22: Date = dt.Day;
23: Hour = dt.Hour;
24: Minute = dt.Minute;
25: Second = dt.Second;
26: }
27: public Time(string strTime) // overloading konstruktor
28: {
29: Console.WriteLine(strTime);
30: }
31:
32: public Time(int Year, int Month, int Date,
33: int Hour, int Minute, int Second) // overloading konstruktor
34: {
35: this.Year = Year;
36: this.Month = Month;
37: this.Date = Date;
38: this.Hour = Hour;
39: this.Minute = Minute;
40: this.Second = Second;
41: }
42: }
43:
44: class Tester
45: {
46: public void Run()
47: {
48: System.DateTime currentTime = System.DateTime.Now;
49: Time time1 = new Time(currentTime);
50: time1.DisplayCurrentTime();
51: Time time2 = new Time(2000, 11, 18, 11, 03, 30);
52: time2.DisplayCurrentTime();
53: }
54:
55: static void Main()
56: {
57: Tester t = new Tester();
58: t.Run();
59: }
60: }
Selain konstruktor overloading juga bisa diterapkan pada method dalam suatu class yang sama, contoh penulisannya:
1: void MyMethod(int p1);
2: void MyMethod(int p1, int p2); // beda banyak parameter
3: void MyMethod(int p1, string s1); // beda tipe data
Enkapsulasi data dengan Property
Enkapsulasi / penyembunyian informasi adalah konsep yang selama ini sering anda dengar. Pada OOP informasi dibungkus dalam sebuah Class sehingga orang yang menggunakan class tersebut tidak perlu tahu detail-nya, hanya cukup mengetahui method dan property apa saja yang ada dalam class tersebut beserta kegunaannya.
Pada pemrograman berorientasi objek variabel dalam class biasanya diberi access modifier private, ini berarti hanya method dalam class tersebut yang dapat mengakses variabelnya. Yang menjadi pertanyaan bagaimana cara anda mengakses variabel bertipe private tersebut? Mengapa harus dibuat private?
Jika anda membuat variable tersebut public maka user yang menggunakan class tersebut bisa memasukan nilai yang tidak kita inginkan, maka anda harus mendeklarasikan variable tersebut secara private agar pada saat setMethod() anda dapat menambahkan validasi inputan dari user.
Anda bisa membuat public method set dan get untuk memberi dan mengambil nilai variabel tersebut, misal:
1: // private member variables
2: private int Year;
3:
4: public int getYear() //get method
5: {
6: return this.Year;
7: }
8:
9: public void setYear(int Year) //set method
10: {
11: this.Year = Year;
12: }
Selain menggunakan cara tersebut diatas pada C# disediakan object property untuk memberi nilai dan mengambil nilai dari private variabel dalam suatu class. Penggunaan object property lebih memudahkan anda dalam penulisan kode dibandingkan harus membuat dua method set dan get untuk mengakses satu variabel private. Contoh penggunaan property dapat dilihat pada contoh kode dibawah ini.
1: class Mahasiswa {
2: private string nim;
3: private string nama;
4:
5: public string Nim {
6: get {
7: return nim;
8: }
9: set {
10: this.nim = value;
11: }
12: }
13:
14: public string Nama {
15: get {
16: return nama;
17: }
18: set {
19: this.nama = value;
20: }
21: }
22:
23: public string DisplayInfo() {
24: return Nim + ” ” + Nama;
25: }
26: }
27:
28: class ClassProperty {
29: public static void Main(string[] args) {
30: Mahasiswa mhs1 = new Mahasiswa();
31: mhs1.Nim = “22002321″;
32: mhs1.Nama = “Erick”;
33: Console.WriteLine(mhs1.DisplayInfo());
34: }
35: }
Get Accessor
Penggunakan get{} pada property mirip dengan jika anda menggunaan method getValue() / getter method pada java, get pasti mengembalikan nilai jadi dalam kalang get harus ada return valuenya.
Set Accessor
Penggunaan set{} pada property mirip dengan jika anda menggunakan setValue() / setter method pada java, set digunakan untuk memberi nilai kedalam class variable. Pada C# jika anda memberi nilai pada property maka set{} otomatis dijalankan.
Specialization dan Generalization
Class dan instannya (objek) tidak berdiri sendiri, seperti objek manusia yang merupakan mahluk sosial tidak hanya berdiri sendiri, objek akan saling berelasi dan berinteraksi, demikian *** pada OOP.
Salah satu hubungan antar objek yang paling penting yang terjadi di dunia nyata adalah spesialisasi yang bisa didefinisikan sebagai is-a relationship, misal anjing adalah mamalia, jika anjing termasuk anggota mamalia maka dia memiliki ciri-ciri special khas yaitu menyusui, punya bulu. Selain sifat-sifat pada mamalia anjing juga memiliki ciri yang spesifik khas anjing yang tidak dipunyai anggota mamalia lainnya seperti kucing.
Relasi spesialisasi dan generalisasi terjadi pada contoh diatas, anjing dan kucing secara general merupakan anggota mamalia tetapi juga terspesialisasi secara spesifik sebagai anjing dan kucing yang mempunyai ciri khas yang berbeda. Relasi tersebut dapat digambarkan secara hirarki.
Inheritance
Pada C# hubungan spesialisasi diimplementasikan menggunakan prinsip inheritance. Penulisan inheritance di C# sebagai berikut
public class ListBox : Window
Kode diatas berarti class ListBox adalah turunan dari class Window
Penggunaan inheritance dapat dilihat pada program dibawah ini
1: public class Window {
2: //variabel dideklarasikan private sehingga tidak bisa diakses oleh kelas
3: //turunannya
4: private int top;
5: private int left;
6:
7: //objek konstruktor
8: public Window(int top, int left) {
9: this.top = top;
10: this.left = left;
11: }
12:
13: public void DrawWindow() {
14: Console.WriteLine(“Draw window pada ({0},{1})”,
15: top, left);
16: }
17: }
18:
19: public class ListBox : Window {
20: //member variable baru pada class anak
21: private string listBoxContent;
22: public ListBox(int top, int left, string contents):base(top,left) {
23: this.listBoxContent = contents;
24: }
25:
26: //versi baru karena override dari base classnya
27: public new void DrawWindow() {
28: base.DrawWindow();
29: Console.WriteLine(“Menuliskan string pada listbox: {0}”,
30: listBoxContent);
31: }
32: }
33:
34: class LatInheritance {
35: public static void Main(string[] args) {
36: Window objWindow = new Window(10, 15);
37: objWindow.DrawWindow();
38:
39: ListBox objList = new ListBox(15, 20, “Hello ListBox”);
40: objList.DrawWindow();
41: }
42: }
Memanggil Base Class Constructor
Pada contoh diatas class ListBox adalah turunan dari class Window, class ListBox mempunyai konstruktornya sendiri yang memiliki tiga parameter, konstruktor pada class ListBox dapat menggunakan tanda : (titik dua) untuk memanggil kosntruktor base class-nya (konstruktor pada class Window)
public ListBox(int top, int left, string theContents):base(top, left)
Karena konstruktor tidak dapat diturunkan maka class turunan harus memiliki konstruktor sendiri.
Polymorphism
Ada dua aspek yang paling penting pada inheritance yang pertama adalah code reuse, sebagai contoh ketika anda membuat class ListBox maka anda dapat menggunakan logic yang sudah dibuat pada class Window
Aspek kedua yang tidak kalah penting dari inheritance adalah polymorhism, poly berarti banyak dan morph berarti bentuk, jadi polymorphism dapat berarti dapat menggunakan banyak bentuk tanpa harus mengacu details yang sama.
Dari istilahnya Polymorphism kesannya sulit dan kompleks, tetapi sebenarnya simple, ilustrasinya begini ketika sebuah perusahaan telpon / provide telpon mengirimkan signal ke anda (dering telpon), mereka tidak tahu telpon apa yang anda gunakan, bisa model lama dengan dering kuno, bisa HP dengan dering music mp3, TV Phone, PDA Phone dll. yang provider tahu bahwa masing-masing telepon mempunyai ‘base type’ telepon dan mempunyai method untuk berdering. Ketika provider mengirimkan signal mereka hanya berharap bahwa telepon akan berdering tidak peduli jenis telponnya, nah provider telepon memperlakukan telepon anda secara polymorphism.
Membuat Type Polymorphism
Dari gambar diatas dapat anda lihat, ListBox is-a Control (karena ListBox turunan dari Control), Button is-a Control, kita berharap bahwa dapat memperlakukan keduanya sebagai Control. Misal anda mempunyai banyak control di collection untuk digambar ke windows, dan mengharapkan ketika memanggil method draw() pada control maka control2 tersebut akan tergambar sesuai dengan tipe objectnya (mis: ListBox, RadioButton, Command, dll).
Anda dapat mengimplementasikan polymorphism dengan dua cara yaitu:
- Membuat virtual method pada base class (class induk)
- Membuat class turunan yang mempunyai method dengan keyword override yang mengganti isi dari method dengan keyword virtual yang ada pada base class-nya.
1: public class Control {
2: //variabel dideklarasikan private sehingga tidak bisa diakses oleh kelas
3: //turunannya
4: private int top;
5: private int left;
6:
7: protected int Top {
8: get {
9: return this.top;
10: }
11: set {
12: this.top = value;
13: }
14: }
15:
16: protected int Left {
17: get {
18: return this.left;
19: }
20: set {
21: this.left = value;
22: }
23: }
24:
25: //objek konstruktor
26: public Control(int top, int left) {
27: Top = top;
28: Left = left;
29: }
30:
31: public virtual void DrawWindow() {
32: Console.WriteLine(“Draw window pada ({0},{1})”,
33: top, left);
34: }
35:
36: }
37:
38: public class ListBox : Control {
39: //member variable baru pada class anak
40: private string listBoxContent;
41: public ListBox(int top, int left, string contents)
42: : base(top, left) {
43: this.listBoxContent = contents;
44: }
45:
46: //versi baru karena override dari base classnya
47: public override void DrawWindow() {
48: base.DrawWindow();
49: Console.WriteLine(“Menuliskan string pada listbox: {0}”,
50: listBoxContent);
51: }
52:
53: }
54:
55: public class Button : Control {
56: public Button(int top, int left) : base(top, left) {}
57:
58: public override void DrawWindow() {
59: //base.DrawWindow();
60: Console.WriteLine(“Menggambar button pada ({0},{1})”, Top, Left);
61: }
62: }
63: class LatPolymophism {
64: static void Main(string[] args) {
65: Control win = new Control(10, 15);
66: ListBox lstBox = new ListBox(5, 10, “Text pada ListBox”);
67: Button b = new Button(5, 6);
68: win.DrawWindow();
69: lstBox.DrawWindow();
70: b.DrawWindow();
71:
72: Control[] winArray = new Control[3];
73: winArray[0] = new Control(10, 15);
74: winArray[1] = new ListBox(5, 10, “Pada ListBox”);
75: winArray[2] = new Button(5, 6);
76:
77: for (int i = 0; i < 3; i++) {
78: winArray.DrawWindow();
79: }
80: }
81: }
Dapat dilihat dari contoh diatas bahwa base class yaitu Window mempunyai method yang bernama DrawWindow() yang mempunyai keyword virtual, ini berarti method tersebut dapat di override atau diganti implementasinya dengan method yang nama dan parameternya sama persis di kelas turunannya yaitu class ListBox.
Versioning dengan new dan override keyword
Pada contoh diatas digunakan keyword virtual pada base class agar dapat dioverride oleh class turunannya. Akan timbul masalah jika misal: Perusahan A membuat class Control kemudian perusahaan B membelinya untuk membuat ListBox dan RadioButton (tapi B tidak bisa memodifikasi class Control karena hanya beli tanpa code), pada saat membuat ListBox perusahaan B menambahkan fungsi sort() kedalam class tersebut
1: public class ListBox : Control
2: {
3: public virtual void Sort( ) {…}
4: }
Hal diatas tidak menjadi masalah sampai perusahaan A menambahkan method sort() juga dalam class Control:
1: public class Control
2: {
3: // …
4: public virtual void Sort( ) {…}
5: }
Maka akan menjadi rancu karena ada dua method dengan nama yang sama ketika anda akan memanggil method sort dari class turunan ListBox, tidak bisa dibedakan mana method sor() pada Control atau ListBox, untuk menangani masalah ini C# menyediakan keyword new.
1: public class ListBox : Control
2: {
3: public new virtual void Sort( ) {…}
4: }
Abstract Class
Setiap tipe Window pasti mempunyai bentuk tampilan yang berbeda misal combobox, listbox, button, dll. Berarti setiap class turunan dari Window harus mempunyai method DrawWindow() nya sendiri yang berbeda satu sama lain. Untuk memastikan bahwa setiap class turunan Control harus mempunyai method DrawWindow() maka anda harus mendefinisikan class tersebut sebagai abstract class dan memiliki method abstract yang belum diimplementasikan.
Abstract method tidak mempunyai implementation, abstract method hanya semacam kontrak yang harus dipenuhi. Semua class yang diturunkan dari class yang mempunyai abstract method harus mengimplementasikan method tersebut.
Class yang didefinisikan sebagai abstract class tidak dapat dibuat instan class / objek, class yang didefinisikan abstract hanya dapat digunakan dengan cara diturunkan.
1: public abstract class Control {
2: private int top;
3: private int left;
4:
5: protected int Top {
6: get { return this.top;}
7: set { this.top = value;}
8: }
9: protected int Left {
10: get {return this.left;}
11: set {this.left = value;}
12: }
13: public Control(int top, int left) {
14: Top = top;
15: Left = left;
16: }
17: //abstract method harus diimplementasikan
18: public abstract void DrawWindow();
19: }
20:
21: public class ListBox : Control {
22: private string listBoxContent;
23: public ListBox(int top, int left, string contents)
24: : base(top, left) {
25: this.listBoxContent = contents;
26: }
27:
28: public override void DrawWindow() {
29: Console.WriteLine(“Position {0},{1})”, Top, Left);
30: Console.WriteLine(“Menuliskan string pada listbox: {0}”,
31: listBoxContent);
32: }
33:
34: }
35:
36: public class Button : Control {
37: public Button(int top, int left) : base(top, left) { }
38: public override void DrawWindow() {
39: Console.WriteLine(“Menggambar button pada ({0},{1})”, Top, Left);
40: }
41: }
42: class LatAbstract {
43: static void Main(string[] args) {
44: Control[] winArray = new Control[3];
45: winArray[0] = new ListBox(5, 10, “Pada ListBox”);
46: winArray[1] = new Button(5, 6);
47: for (int i = 0; i < 2; i++) {
48: winArray.DrawWindow();
49: }
50: }
51: }
Tapi untuk kasus diatas abstract masih mempunyai keterbatasan, jika anda ingin membuat class DropDownList yang hendak diturunkan dari class ListBox, maka anda tidak dapat memaksakan method DrawWindow() harus ada di class tersebut.
Sealed Class
Jika anda ingin membuat class yang tidak dapat diturunkan lagi maka anda dapat menambahkan keyword ‘sealed’.
Object Root dari semua class
Semua class dari semua type diturunkan dari satu class untama yaitu class object. Meskipun tidak dituliskan secara eksplisit namun pada dasarnya semua class diturunkan dari class object.
Beberapa method yang ada pada class object adalah: Equals(), GetHashCode(), GetType(), ToString(), Finalize(), MemberwiseClone(), ReferenceEquals().
Method dari class yang ada diatas dapat dioverride oleh semua class karena pada dasarnya semua class diturunkan dari class object.
1: public class Cat {
2: private int weight;
3: public Cat(int weight) {
4: this.weight = weight;
5: }
6:
7: public override string ToString() {
8: return weight.ToString();
9: }
10: }
11: class LatObject {
12: static void Main(string[] args) {
13: Cat catty = new Cat(60);
14: Console.WriteLine(“Berat si catty : ” + catty);
15: }
16: }
Boxing dan Unboxing Types
Boxing dan Unboxing adalah suatu proses ketika suatu tipe data value (seperti int) di konversikan menjadi tipe reference / object. Istilah boxing berarti diubah menjadi object dan unboxing berarti dikembalikan lagi ke tipe data value.
Proses boxing dilakukan secara implisit jadi compiler otomatis akan melakukannya ketika kita mengisi nilai bertipe value kedalam variabel bertipe object.
1: int myIntegerValue = 5;
2: object myObject = myIntegerValue; // cast to an object
3: myObject.ToString();
Tidak seperti boxing, proses unboxing harus eksplisit. Ketika proses unbox kita harus tahu tipe data apa yang kita ingin konversikan dari tipe objek-nya.
1: int myInt = 123;
2: //proses boxing (dilakukan secara otomatis)
3: object objInt = myInt;
4: Console.WriteLine(“Nilai ObjInt : {0}”,objInt.ToString());
5:
6: //proses unboxing (harus dilakukan secara eksplisit)
7: myInt = (int)objInt;
8: Console.WriteLine(“Nilai myInt : {0}”, myInt.ToString());
Menghindari Boxing dan unboxing dengan Generic
Proses boxing dan unboxing mempengaruhi performa program, karena semua harus di boxing kedalam tipe object (misal: dalam penggunaan ArrayList). Pada C# 2.0 keatas sudah mendukung generic sehingga proses boxing dan unboxing dapat dihindari.
Interfaces
Jika anda ingin mendefinisikan tipe baru tetapi tidak ingin mengimplementasikan isinya secara langsung maka anda dapat menggunakan interfaces.
Pada dasarnya interface adalah sebuah kontrak, ketika anda mendesign interface seolah-olah anda mengatakan “jika anda ingin menggunakan class ini maka anda harus mengimplementasikan method, property yang sudah disediakan”. Class yang menggunakan interface tersebut setuju dengan kontrak dan mengimplementasikan requirement yang ditentukan.
Dibandingkan dengan abstract class, abstract class hanya bisa digunakan di class paling atas ‘top-hierarchy’ sedangkan interface dapat digunakan di setiap class yang diinginkan (setiap class dapat mengimplementasikan lebih dari satu interface).
Perbedaan Interface dan Abstract Class
Programmer sering merasa bingung dalam mebedakan Interface dan Abstract Class. Beberapa perbedaannya adalah:
- Cara penggunaan Abstract Class adalah diturunkan, sedangkan cara penggunaan Interface adalah diimplementasikan.
- Pada C# lambang untuk menurunkan class dan menggunakan interfaces sama-sama menggunakan tanda “:” (titik dua). Tetapi untuk membedakan biasanya nama interface diawali dengan huruf I di depan misal: IEnumerable, IDisposable, dll.
- Sebuah class hanya dapat diturunkan dari satu abstract class tapi dapat menggunakan lebih dari satu interfaces.
- Method dan member variable pada abstract class boleh sudah ada isinya, sedangkan pada interfaces semua belum ada implementasinya.
- Pada Abstract Class semua method / member variable yang abstract harus diimplementasikan di class turunannya.
- Pada Interface semua member variable dan method harus diimplementasikan di class yang menggunakan interface tersebut.
- Access Modifier pada method dan member variable di Interface secara implisit adalah public.
Mengimplementasikan lebih dari satu Interface1: interface IStorable {
2: void Read();
3: void Write();
4: int Status { get; set; }
5: }
6:
7: public class Document : IStorable {
8: private int status = 0;
9:
10: public Document(string s) {
11: Console.WriteLine(“Create : {0}”, s);
12: }
13:
14: public void Read() {
15: Console.WriteLine(“Mengimplementasikan method Read dari IStorable”);
16: }
17:
18: public void Write() {
19: Console.WriteLine(“Mengimplementasikan method Write dari IStorable”);
20: }
21:
22: public int Status {
23: get { return this.status; }
24: set { this.status = value; }
25: }
26: }
27:
28: class LatSimpleInterface {
29: static void Main(string[] args) {
30: Document doc = new Document(“New Document”);
31: doc.Read();
32: doc.Write();
33: doc.Status = 1;
34: Console.WriteLine(“Document status : {0}”, doc.Status);
35: }
36: }
Pada C# sebuah class hanya dapat diturunkan dari sebuah class saja, tidak seperti bahasa C++ yang mendukung multipe inheritance. Tetapi untuk interface anda dapat menggunakan lebih dari satu interface dalam sebuah class.
Misal saja untuk class dokumen diatas dapat disimpan dan dapat juga dikompres datanya, maka anda dapat menambahkan interface Icompressible kedalam class tersebut.
Interface juga dapat dikombinasikan, anda bisa menambahkan inteface kedalam interface lain, misal:
Delegates dan Event1: interface ICompessible {
2: void Compress();
3: void Decompress();
4: }
5: interface ILoggedCompresible : ICompessible {
6: void LogSavedBytes();
7: }
Ketika anda menggunakan interface IloggedCompresible maka anda harus mengimplementasikan method Compress(), Decompress(), dan LogSavedBytes().
1: interface IStorable {
2: void Read();
3: void Write(object obj);
4: int Status { get; set; }
5: }
6:
7: interface ICompressible {
8: void Compress();
9: void Decompress();
10: }
11:
12: interface ILoggedCompressible : ICompressible {
13: void LogSavedBytes();
14: }
15:
16: interface IStorableCompressible : IStorable, ILoggedCompressible{
17: void LogOriginalSize();
18: }
19:
20: interface IEncryptable {
21: void Encrypt();
22: void Decrypt();
23: }
24:
25: public class Document : IStorableCompressible, IEncryptable {
26: private int status = 0;
27:
28: public Document(string s) {
29: Console.WriteLine(“Creating Document: {0}”, s);
30: }
31:
32: public void LogOriginalSize() {
33: Console.WriteLine(“Mengimplementasikan method LogOriginalSize”);
34: }
35:
36: public void Read() {
37: Console.WriteLine(“Mengimplementasikan method Read”);
38: }
39:
40: public void Write(object obj) {
41: Console.WriteLine(“Mengimplementasikan method Write”);
42: }
43:
44: public int Status {
45: get { return status; }
46: set { this.status = value; }
47: }
48:
49: public void LogSavedBytes() {
50: Console.WriteLine(“Mengimplementasikan method LogSavedBytes”);
51: }
52:
53: public void Compress() {
54: Console.WriteLine(“Mengimplementasikan method Compress”);
55: }
56:
57: public void Decompress() {
58: Console.WriteLine(“Mengimplementasikan method Decompress”);
59: }
60:
61: public void Encrypt() {
62: Console.WriteLine(“Mengimplementasilan method Encrypt”);
63: }
64:
65: public void Decrypt() {
66: Console.WriteLine(“Mengimplementasikan method Decrypt”);
67: }
68: }
69:
70: class LatMultipleInterface {
71: static void Main(string[] args) {
72: Document doc = new Document(“New Document”);
73: doc.Read();
74: doc.Compress();
75: doc.LogSavedBytes();
76: doc.LogOriginalSize();
77: doc.Encrypt();
78: doc.Decrypt();
79: doc.Decompress();
80: doc.Status = 1;
81: Console.WriteLine(“Status {0}”, doc.Status);
82: }
83: }
Mungkin anda pernah menjumpai situasi dimana anda ingin mengeksekusi suatu action tetapi anda belum tahu pasti isi dari detail methodnya atau bahkan tidak tahu objectnya. Misal method untuk menghandle button press (ketika object button tersebut ditekan). Anda harus membayangkan bahwa pembuat komponen button, textbox, listbox bukanlah programmer yang menggunakan object tersebut. Pembuat button hanya tahu bahwa button tersebut mempunyai event click (ketika diklik) tapi pembuat buton tidak tahu apa yang terjadi ketika button tersebut diklik (hanya diketahui oleh programmer yang menggunakan button tersebut).
Untuk mengatasi masalah diatas pembuat button sudah menyediakan event misal click, mouse_mive, dll. jika programmer hendak menggunakannya maka dapat mengaksesnya menggunakan delegates. Delegates adalah semacam kontrak yang harus dipenuhi ketika hendak menggunakan method tertentu (mirip dengan interfaces).
SELESAI1: delegate void StringProcesssor(string input);
2: class Person {
3: private string name;
4:
5: public Person(string name) {
6: this.name = name;
7: }
8:
9: public void Say(string message) {
10: Console.WriteLine(“{0} says : {1}”, name, message);
11: }
12: }
13:
14: class Background {
15: public static void Note(string note) {
16: Console.WriteLine(“({0}) “, note);
17: }
18: }
19:
20: class LatSimpleDelegates {
21: static void Main(string[] args) {
22: Person rick = new Person(“Erick”);
23: Person jhon = new Person(“Jhon”);
24: StringProcesssor jonsVoice, rickVoice, background;
25: rickVoice = new StringProcesssor(rick.Say);
26: jonsVoice = new StringProcesssor(jhon.Say);
27: background = new StringProcesssor(Background.Note);
28:
29: rickVoice(“Hello Jhon !!”);
30: jonsVoice(“Hello rick !!”);
31: background(“Suara ramai lalu lintas”);
32: }
33: }