Konsep Bahasa Pemograman (C#)

Kembali ke => Kumpulan mata kuliah Teknik Informatika

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. 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

  1. TypeData Nama_variabel;

Contoh :

                   string nama_barang;

                   int jumlah;

                   nama_barang=”Buku”;

                   jumlah=2;

  1. 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;

  1. 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();

        }

          }

  1. 2.   Selection Statemen

Teori :

Selection statement digunakan untuk menentukan bagian mana dari program yang akan

Dieksekusi selanjutnya. C# menyediakan dua jenis selection yaitu if danswitch.

2.1        if

If statement digunakan untuk mengeksekusi kode program jika kondisi tertentu

terpenuhi.

Praktek 1.

class ContohIf

          {

                   public static void Main2()

                   {

                             Console.Write(“Masukkan nilai x : “);

                             int x = int.Parse(Console.ReadLine());

                             Console.Write(“Masukkan nilai y : “);

                             int y = int.Parse(Console.ReadLine());

                             if (y!=0)

                             {

                                                    double hasil = x/y;

                                                    Console.WriteLine(“Hasil pembagian x/y = {0}”,hasil);

                             }                          

                                              Console.ReadLine();

                   }

          }

2.2        if else

Satu variasi dari if statement adalah if-else. Dalam statement ini, selain menentukan

langka apa yang harus dilakukan jika suatu kondisi terpenuhi, kita juga bisa

menentukan langkah apa yang mesti dilakukan kalau kondisi tersebut TIDAK terpenuhi.

 Praktek 2

class ContohIfElse

   {

      public static void Main2()

      {

         Console.Write(“Masukkan nilai x : “);

         int x = int.Parse(Console.ReadLine());

         Console.Write(“Masukkan nilai y : “);

         int y = int.Parse(Console.ReadLine());

         if (y!=0)

         {

            double hasil = x/y;

            Console.WriteLine(“Hasil pembagian x/y = {0}”,hasil); 

         }

         else

         {

            Console.WriteLine(“y bernilai 0”);

         }

         Console.ReadLine();

      }

   }

2.3        Switch

Logika dari statement switch secara prinsip sama dengan stement if

Praktek 3

class ContohSwitch

    {

        public static void Main2()

        { 

        switch (DateTime.Now.DayOfWeek)

        {

            case DayOfWeek.Sunday:

            {

                Console.WriteLine(“Sekarang hari Minggu”);

                      break;

            }                        

            case DayOfWeek.Monday:

            {

                Console.WriteLine(“Sekarang hari Senin”);    

                break;

            }

            case DayOfWeek.Tuesday:

            {

                Console.WriteLine(“Sekarang hari Selasa”);   

                break;

            }                        

            default:

            {

                Console.WriteLine(“Sekarang hari apa ya?”);

                break;

            }

        }

        Console.ReadLine();

        }

    }

  1. 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

Kembali ke => Kumpulan mata kuliah Teknik Informatika

42 responses to “Konsep Bahasa Pemograman (C#)

  1. sori mas saya numpang copas ya buat belajar, soale saya juga lagi mau belajar serius c#, minta saran biar cepet bisa konsepnya yang pertama dan yang kedua tentunya codingnya. Terimakasih.

    • Ok Mas Priyanto, gpp, saya juga lagi belajar C#, kayaknya yang penting berminat dulu/niat kali ya, jadi nantinya bisa serius, dan yang penting pelan2 saja, sehingga bisa dipahami dengan baik konsep maupun codingnya….

    • Wah tergantung konsepnya seperti apa, temporary atau disimpan di tabel, tapi berikut ini sebagai contohnya :
      CONTOH 1
      Class SalesOrder
      {
      private ArrayList orderDetail;

      public void Add(OrderDetail order)
      {
      this.orderDetail.Add(order);
      }

      public Decimal Total()
      {
      Decimal total;
      foreach (OrderDetail order in orderDetail)
      {
      total += order.Total;
      }
      return total;
      }
      }

      CONTOH 2
      (from o in orders
      select new {
      o.CustomerName,
      Total = o.Lines.Sum(x=>x.UnitPrice*x.Quantity)}
      ).OrderBy(x=>x.CustomerName).ThenBy(x=>x.Total);;

      ATAU BY QUERY :
      SELECT SUM(total_transaksi) AS total_nominal_transaksi
      FROM user

      Demikian, mudah2an tidak tambah pusing, saya juga masih belajar…🙂

    • Menurut saya belajarnya pelan2 saja Mas, satu persatu harus dipahami seperti selection, iterasi, method, dst… salahnya saya waktu itu belajar langsung bikin program web .net dan C#, jadi bingung pas ada masalah… Selamat belajar, terima kasih sudah mampir di blog saya…

  2. Today, I went to the beach with my children. I found a sea shell and
    gave it to my 4 year old daughter and said “You can hear the ocean if you put this to your ear.” She put the shell to her ear and
    screamed. There was a hermit crab inside and it pinched her ear.
    She never wants to go back! LoL I know this is entirely off topic but I had to tell someone!

  3. numpang tanya dong.kalau ingin membuat rumus tapi pakai persen itu gimana ya?
    misal nilai akhir = 50% uas + 25% uts + 25% tugas
    kalau yg saya buat akhir = 0.5 * uas + 0.25 * uts + 0.25 tugas
    tapi selalu keluar Cannot implicitly convert type ‘double’ to ‘int’. An explicit conversion exists (are you missing a cast?).saya uda coba di pertama buat double satu = 0.5;
    double dua = 0.25;
    double tiga = 0.25;
    tapi tetep keluar seperti itu dan masalahnya selalu di rumusnya.boleh kasih saran hrus dibuat sperti apa ya?
    makasih

    • Mungkin lebih enak jika source code ditampilkan mas…. tapi mudah2an contoh dibawah ini bisa membantu :

      using System;

      class Mahasiswa
      {
      // field atau status dari class mahasiswa
      string nama;
      int usia;
      int nilaiMat;
      int nilaiBahasa;
      int nilaiManajemen;
      int nilaiInggris;
      int totalNilai;
      double rataRata;

      //method2

      void hitungTotalNilai()
      {
      totalNilai = nilaiMat + nilaiBahasa +
      nilaiManajemen + nilaiInggris;
      }

      void hitungRataRata()
      {
      rataRata = (double)totalNilai / 4;
      }

      double ambilRataRata()
      {
      return rataRata;
      }

      //method utama
      public static void Main()
      {
      //membuat instance dari class mahasiswa
      Mahasiswa mhs = new Mahasiswa();

      //menentukan isi dari field
      mhs.nama = “Atep”;
      mhs.usia = 29;
      mhs.nilaiMat = 80;
      mhs.nilaiBahasa = 90;
      mhs.nilaiManajemen = 60;
      mhs.nilaiInggris = 86;

      //memanggil method
      mhs.hitungTotalNilai();
      mhs.hitungRataRata();

      double mhsRataRata = mhs.ambilRataRata();

      //memanggil dan menerima nilai yang
      //dikembalikan dari method

      Console.WriteLine(“nama : {0} \nUsia : {1}” +
      “\nRata-rata : {2}”, mhs.nama, mhs.usia,
      mhsRataRata);

      Console.ReadLine();

      }
      }

  4. Maaf ya mas, saya malah kurang ngerti @.@…
    gimana kalo saya kasih soalnya ^^.
    buatlah aplikasi untuk menghitung nilai akhir dengan meminta inputan dari user berupa :
    1. nama siswa
    2. nilai uts
    3. nilai uas
    4. nilai tugas
    hitung nilai akhir dengan rumus:
    nilai akhir = 25%nilai uts + 50% niali uas + 25% tugas
    bagaimana enaknya ya cara buat rumusnya itu?soalnya kan kalau pake persen,ga bisa ya?
    makasih banyak ^^

  5. bermanfaat bget untuk menambah referensi basic c#
    mas., boleh kirim code nya gak ke ihsan_unggul@yahoo.com
    soal’a code yang di atas ada baris’a ketika dipaste.,
    enakan kan gak ada baris.,🙂
    contoh :

    1: delegate void StringProcesssor(string input);

    2: class Person {

    3: private string name;

    4:

    5: public Person(string name) {

    6: this.name = name;

    7: }

    hhe.
    thanks,

    • Wah berarti saya harus revisi artikel ini dengan tanpa nomor baris…hehe. Tapi cara yang paling gampang, mas copy aja contoh script yang mau di pake ke ms word, terus di ms word gunakan fungsi Control & Paste (Ctrl+F), klik tombol More, pilih drop down list Special lalu pilih Any Character, pada bagian Find what akan muncul ^? tambahkan huruf titik dua (:), lalu klik tab Replace, kosongkan pada bagian Replace with, lalu klik tombol Replace, maka satu per satu yang mengandung angka baris dan titik dua akan dihapus. Selamat mencoba, terima kasih.

    • Kalu gak salah ada di contoh point 6.3 mas, kalo contoh lain dibawah ini :
      using System;

      class Program
      {
      static void Main()
      {
      Console.WriteLine(M());
      }

      static int M()
      {
      int dummy = 0;
      for (int a = 0; a < 10; a++)
      {
      for (int y = 0; y < 10; y++) // Run until condition.
      {
      for (int x = 0; x < 10; x++) // Run until condition.
      {
      if (x == 5 &&
      y == 5)
      {
      goto Outer;
      }
      }
      dummy++;
      }
      Outer:
      continue;
      }
      return dummy;
      }
      }

  6. maaf mas belom kena..
    kalo’ di c++ gotoxy(3,4);
    kita bisa nentuin sendiri koordinatnya, x=3 dan y=4
    kalo’ di c# gimana biar kita bisa nampilin ditengah layar, atau dimana terserah kita..
    minta pencerahannya mas..

    • Barusan saya coba sekali lagi, bisa tuh, coba pastikan waktu select muncul background putih, baru Ctr C sampai tanda background putih hilang, baru Ctrl V di excelnya…

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s