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.
1.2 Arsitektur Framework .NET
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
Jika kita membuat sekumpulan Class untuk membuat aplikasi berbasis
windows, maka Class-Class itu bisa kita gunakan untuk jenis aplikasi
lain, seperti aplikasi berbasis web (ASP.NET).
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 “*/”
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 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 @.
Contoh :
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 switch
4.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
Teori :
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 @.
Contoh :
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 |
3.2.2 Deklarasi Variable
Ada 3 cara dalam mendeklarasikan/penulisan Variabel adalah sebagai berikut
- TypeData Nama_variabel;
Contoh :
string nama_barang;
int jumlah;
nama_barang=”Buku”;
jumlah=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;
- 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;
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
Teori :
Selection statement digunakan untuk menentukan bagian mana dari program yang akan
Dieksekusi selanjutnya. C# menyediakan dua jenis selection yaitu
if dan
switch.
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
Array adalah suatu struktur data yang dapat menyimpan data dengan
tipe yang sama dan diakses dengan menggunakan suatu indeks yang
menunjukan suatu elemen didalam array tersebut.
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 OOP
Aplikasi 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.
Penggunaan prinsip polymorphism dapat dilihat pada contoh program dibawah ini
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.
1: 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: }
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 OOP
Aplikasi 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.
Penggunaan prinsip polymorphism dapat dilihat pada contoh program dibawah ini
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.
1: 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: }
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: }
SELESAI