Tuesday, December 13, 2016

Bab 8. Dasar Pemrograman C#



Pewarisan dan Polimorfisme



8.1 Pewarisan
KONSEP: Pewarisan dipakai agar sebuah kelas baru dapat mewarisi kelas yang telah ada. Kelas baru tersebut mewarisi anggota-anggota dari kelas yang ia warisi.

Generalisasi dan Spesialisasi
Di dunia nyata, Anda dapat menemukan banyak objek yang merupakan versi-versi terspesialisasi dari objek-objek yang lebih umum. Sebagai contoh, istilah serangga menjelaskan jenis mahlum umum dengan sejumlah karakteristik. Karena belalang dan tawon adalah serangga, keduanya memiliki karakteristik-karakteristik umum dari serangga. Selain itu, keduanya juga memiliki karakteristik-karakteristik spesial sendiri. Sebagai contoh, belalang memiliki kemampuan melompat, dan tawon memiliki kemampuan menyengat. Belalang dan tawon merupakan versi terspesialisasi dari serangga. Ini iilustrasikan pada Gambar 8.1.



Gambar 8.1 Tawon dan belalang merupakan versi-versi terspesialisasi dari serangga


Pewarisan dan Relasi “Adalah suatu”
Ketika suatu objek adalah versi terspesialisasi dari objek lain, terdapat relasi “adalah suatu” di antara keduanya. Sebagai contoh, belalang adalah suatu serangga. Berikut adalah beberapa contoh relasi “adalah suatu”:
·         Poodle adalah suatu anjing.
·         Mobil adalah suatu kendaraan.
·         Bunga adalah suatu bunga.
·         Persegi adalah suatu bangun.
·         Pemain bola adalah suatu atlit.

Ketika relasi “adalah suatu” didapati antara objek-objek, ini berarti bahwa objek terspesialisasi memiliki semua karakteristik dari objek umum, ditambah dengan karakteristik-karakteristik lain yang membuatnya spesial. Pada pemrograman berorientasi-objek, pewarisan dipakai untuk menciptakan relasi “adalah suatu” di antara kelas-kelas. Ini dapat Anda pakai untuk mewarisi kapabilitas-kapabilitas dari suatu kelas dengan menciptakan kelas lain yang merupakan versi terspesialisasi dari kelas itu.


Pewarisan melibatkan suatu kelas basis dan suatu kelas terderivasi. Kelas basis adalah kelas umum dan kelas terderivasi adalah kelas terspesialisasi. Anda dapat menganggap bahwa kelas terderivasi adalah versi ekstensi dari kelas basis. Kelas terderivasi mewarisi semua bidang, properti, dan metode dari kelas basis tanpa menulis-ulangnya. Selain itu, bidang-bidang baru, properti-properti baru, dan metode-metode baru dapat ditambahkan pada kelas terderivasi, dan itulah yang membuatnya menjadi versi terspesialisasi dari kelas basis.


CATATAN: Kelas basis kadangkala dinamakan dengan superkelas, dan kelas terderivasi kadangkala dinamakan dengan subkelas. Buku ini menggunakan istilah kelas basis dan kelas terderivasi.

Lihat contoh bagaimana pewarisan dapat digunakan. Dimisalkan bahwa Anda sedang mengembangkan suatu aplikasi dimana sebuah dealer kendaraan dapat mengelola sistem inventori dari kendaraan bekas. Inventori dealer tersebut mencakup tiga jenis kendaraan: mobil, truk, SUV (sport-utility vehicles). Tanpa melihat jenis kendaraan, dealer memiliki data berikut untuk setiap kendaraan:
·         Buatan
·         Tahun Model
·         Jarak Kilometer
·         Harga

Setiap jenis kendaraan yang disimpan di dalam inventori memiliki karakteristik-karakteristik umum tersebut ditambah dengan karakteristik-karakteristik spesialnya sendiri. Untuk mobil, dealer memiliki data tambahan berikut:
·         Jumlah pintu (2 atau 4)

Untuk truk, dealer memiliki data tambahan berikut:
·         Jenis penggerak (penggerak dua-roda atau penggerak empat-roda)

Dan untuk SUV, dealer memiliki data tambahan berikut:
·         Kapasitas penumpang

Dalam merancang program ini, satu pendekatan yang bisa dilakukan adalah dengan menuliskan tiga kelas berikut:
·         Kelas Mobil dengan properti-properti untuk buatan, tahun model, jarak km, harga, dan jumlah pintu.
·         Kelas Truk dengan properti-properti untuk buatan, tahun model, jarak km, harga, dan jenis penggerak.
·         Kelas SUV dengan properti-properti untuk buatan, tahun model, jarak km, harga, dan kapasitas penumpang.

Ini merupakan pendekatan yang tak efisien, karena ketiga kelas memiliki sejumlah properti yang sama. Hasilnya, kelas-kelas akan memuat banyak kode duplikat. Selain itu, jika Anda nantinya menemukan bahwa Anda perlu menambahkan sejumlah atribut yang sama, maka Anda perlu memodifikasi ketiga kelas tersebut.

Pendekatan yang lebih baik adalah dengan menuliskan kelas basis Otomobil untuk memuat semua data umum tentang otomobil (kendaraan) dan kemudian menuliskan kelas-kelas terderivasi untuk tiap jenis spesifik dari otomobil. Kode berikut menunjukkan kelas Otomobil:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Otomobil
{
    //Bidang-bidang
    private string _buatan;
    private string _model;
    private int _jarakKm;
    private decimal _harga;

    //Konstruktor
    public Otomobil()
    {
        _buatan = "";
        _model = "";
        _jarakKm = 0;
        _harga = 0;
    }

    //Membuat properti
    public string Buatan
    {
        get { return _buatan; }
        set { _buatan = value; }
    }

    //Properti Model
    public string Model
    {
        get { return _model; }
        set { _model = value; }
    }

    //Properti JarakKm
    public int JarakKm
    {
        get { return _jarakKm; }
        set { _jarakKm = value; }
    }

    //Properti Harga
    public decimal Harga
    {
        get { return _harga; }
        set { _harga = value; }
    }
}
  

Baris 4-7 mendeklarasikan bidang-bidang pendukung untuk properti Buatan, Model, JarakKm, dan Harga. Konstruktor tanpa parameter, yang ditampilkan pada baris 10-16 menugaskan string kosong kepada bidang _buatan dan _model dan 0 kepada bidang _jarakKm dan _harga. Kode untuk properti Buatan, Model, JarakKm, dan Harga diberikan pada baris 19-44.

Kelas Otomobil merupakan sebuah kelas template dari mana Anda dapat menciptakan objek-objek. Namun, kelas Otomobil hanya memuat data umum untuk sebuah otomobil. Ia tidak memuat data spesifik tentang mobil, truk, dan SUV. Untuk memuat data spesifik untuk tiap jenis otomobil, Anda perlu menuliskan kelas-kelas terderivasi yang mewarisi kelas Otomobil. Kode berikut menunjukkan kelas Mobil, yang diderivasi dari kelas Otomobil:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Mobil : Otomobil
{
    //Bidang
    private int _pintu;

    //Konstruktor
    public Mobil()
    {
        _pintu = 0;
    }

    //Properti Pintu
    public int Pintu
    {
        get { return _pintu; }
        set { _pintu = value; }
     }
}

Amati header kelas pada baris 1:

class Mobil : Otomobil

Baris kode ini memiliki notasi baru. Setelah nama kelas, Mobil, sebuah titik-dua (kolon) diberikan, yang diikuti dengan nama dari kelas lain, Otomobil. Baris kode ini mengindikasikan bahwa Anda sedang mendefinisikan sebuah kelas dengan nama Mobil, dan ia diderivasi dari kelas Otomobil. Kelas Mobil adalah kelas terderivasi dan kelas Otomobil adalah kelas basis. Gambar 8.2 mengilustrasikan notasi ini. Jika Anda ingin mengekspresikan relasi antara kelas Mobil dan kelas Otomobil, Anda dapat mengatakan bahwa sebuah Mobil adalah suatu Otomobil.



Gambar 8.2 Notasi pewarisan pada header kelas


Karena kelas Mobil diderivasi dari kelas Otomobil, kelas Mobil mewarisi semua anggota dari kelas Otomobil, kecuali konstruktornya. (Tujuan dari konstruktor kelas basis adalah untuk menciptakan suatu objek dari kelas basis, jadi masuk akal jika kelas terderivasi tidak mewarisi konstruktor dari kelas basis).


Kelas Mobil memiliki sebuah konstruktor tanpa parameter yang ditampilkan pada baris 7-10. Pada baris 9, konstruktor menugaskan nilai 0 kepada bidang _pintu. Berikut adalah simpulan dari apa yang terjadi ketika sebuah objek dari kelas Mobil diciptakan:
·       Konstruktor kelas basis dieksekusi lebih dahulu. Pada kasus ini, konstruktor kelas Otomobil akan dipanggil, dan ia akan menugaskan string kosong kepada bidang _buatan dan bidang _model dan menugaskan 0 kepada bidang _jarakKm dan bidang _harga.
·         Konstruktor kelas terderivasi dieksekusi selanjutnya. Pada kasus ini, 0 ditugaskan kepada bidang _pintu.

Kode untuk properti Pintu ditampilkan pada baris 13-17. Sebelum melanjutkan diskusi ini, Anda perlu melihat aplikasi utuh yang mendemonstrasikan kelas Otomobil dan kelas Mobil. Projek ini memuat sebuah form dengan nama Form1, kelas Otomobil, dan kelas Mobil. Gambar 8.3 menunjukkan form Form1.

Gambar 8.3 Form Form1 dari projek Demo Mobil


Ketika Anda menjalankan aplikasi, masukkan data mobil ke dalam kotak-kotak teks dan kemudian klik tombol Ciptakan Objek. Aplikasi akan menciptakan sebuah objek dari kelas Mobil dan menugaskan data dari kotak-kotak teks tersebut ke properti-properti dari objek. Ia kemudian akan membaca dan menampilkan nilai dari tiap properti objek pada kontrol labelBuatan, labelModel, labelJarakKm, labelHarga, dan labelPintu. Gambar 8.4 menunjukkan suatu contoh form dari aplikasi setelah user memasukkan data dan mengklik tombol Ciptakan Objek.

Program 8.1 Kode Form1 pada projek Demo Mobil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Demo_Mobil
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //metode GetDataMobil menerima sebuah objek Mobil sebagai
        //suatu argumen. Ia menugaskan data yang dimasukkan user
         //kepada properti-properti dari objek.
        private void GetDataMobil(Mobil mobil)
        {
            //Variabel-variabel temporer untuk memuat jarak km, harga,
            //dan jumlah pintu
            int jarakKm;
            decimal harga;
            int pintu;

            //Membaca pembuat mobil.
            mobil.Buatan = teksBuatan.Text;

            //Membaca model mobil
            mobil.Model = teksModel.Text;

            //Membaca jarak km dari mobil
            if (int.TryParse(teksJarakKm.Text, out jarakKm))
            {
                mobil.JarakKm = jarakKm;

                //Membaca harga mobil
                if (decimal.TryParse(teksHarga.Text, out harga))
                {
                    mobil.Harga = harga;

                    //Membaca jumlah pintu
                    if (int.TryParse(teksPintu.Text, out pintu))
                    {
                        mobil.Pintu = pintu;
                    }
                    else
                    {
                        //Menampilkan pesan error
                        MessageBox.Show("Jumlah pintu tidak valid");
                    }
                }
                else
                {
                    //Menampilkan pesan error
                    MessageBox.Show("Harga tidak valid");
                }
            }
            else
            {
                //Menampilkan pesan error
                MessageBox.Show("Jarak Km tidak valid");
            }
        }

        private void tombolCiptakan_Click(object sender, EventArgs e)
        {
            //Menciptakan objek Mobil
            Mobil mobilKu = new Mobil();

            //Membaca data mobil
            GetDataMobil(mobilKu);

            //Menampilkan data mobil
            labelBuatan.Text = mobilKu.Buatan;
            labelModel.Text = mobilKu.Model;
            labelJarakKm.Text = mobilKu.JarakKm.ToString();
            labelHarga.Text = "Rp." + mobilKu.Harga.ToString();
            labelPintu.Text = mobilKu.Pintu.ToString();
        }

        private void tombolKeluar_Click(object sender, EventArgs e)
        {
            //Menutup form
            this.Close();
        }
    }
}

Gambar 8.4 Aplikasi Demo Mobil

Amati kode lebih dekat:
Baris 23-69: Ini adalah kode untuk metode GetDataMobil. Tujuan dari metode ini adalah untuk menerima sebuah objek Mobil sebagai argumen, membaca data mobil yang dimasukkan oleh user (melakukan validasari masukan pada jarak km, harga, dan pintu), dan menyimpan data itu ke dalam properti-properti dari objek Mobil.

Baris 74: Statemen ini menciptakan suatu objek dari kelas Mobil, yang direferensi oleh variabel mobilKu.

Baris 77: Statemen ini memanggil metode GetDataMobil, yang melewatkan objek mobilKu sebagai argumen. Setelah metode ini dieksekusi, properti-properti dari objek mobilKu akan memuat data yang dimasukkan oleh user.

Baris 80-84: Statemen-statemen ini menampilkan properti-properti dari objek mobilKu.

Sekarang, lihat kelas Truk dan kelas SUV, yang juga diderivasi dari kelas Otomobil. Berikut adalah kode untuk kelas Tru:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Truk : Otomobil
{
    //Bidang
    private string _penggerak;

    //Konsruktor
    public Truk()
    {
        _penggerak = "";
    }

    //properti Penggerak
    public string Penggerak
    {
        get { return _penggerak; }
        set { _penggerak = value; }
    }
}

Kelas Truk memiliki sebuah properti string dengan nama Penggerak. Properti ini memuat sebuah nilai seperti “Penggerak Dua-Roda” atau “Penggerak Empat-Roda”. Bidang pendukung untuk properti ini dinamai dengan _penggerak dan dideklarasikan pada baris 4. Kode untuk properti ini ada pada baris 13-17. Konstruktor, yang ditampilkan pada baris 7-10, menugaskan sebuah string kosong kepada bidang _penggerak. Sekarang, lihat pada kelas SUV, yang juga diderivasi dari kelas Otomobil:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class SUV : Otomobil
{
    //Bidang
    private int _penumpang;

    //Konstruktor
    public SUV()
    {
        _penumpang = 0;
    }

    //Properti Penumpang
    public int Penumpang
    {
        get { return _penumpang; }
        set { _penumpang = value; }
    }
}

Kelas SUV memiliki sebuah properti int dengan nama Penumpang. Properti ini memuat kapasitas penumpang dari kendaraan. Bidang pendukung untuk properti ini dinamai dengan _penumpang, dan dideklarasikan pada baris 4. Kode untuk properti ini pada baris 13-17. Konstruktor, yang ditampilkan pada baris 7-10, menugaskan sebuah string kosong kepada bidang _penumpang.

Sekarang, lihat pada sebuah program yang mendemonstrasikan keempat kelas ini. Projek ini diberi nama Mobil Truk SUV. Projek ini memuat sebuah form dengan nama Form1, kelas Otomobil, kelas Mobil, kelas Truk, dan kelas SUV. Gambar 8.5 menunjukkan form Form1, dan program 8.2 menunjukkan kode untuk file Form1.cs.

Gambar 8.5 Form Form1 dari Projek Mobil Truk SUV


Program 8.2 Kode Form1 pada projek Mobil Truk SUV
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Mobil_Truk_SUV
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void tombolCiptakan_Click(object sender, EventArgs e)
        {
            //Menciptakan sebuah objek Mobil untuk sebuah BMW 2015 dengan 70000 km
            //diberi harga 250000000 dengan 4 pintu
            Mobil mobilKu = new Mobil();
            mobilKu.Buatan = "BMW";
            mobilKu.Model = "2015";
            mobilKu.JarakKm = 70000;
            mobilKu.Harga = 250000000;
            mobilKu.Pintu = 4;

            //Menciptakan sebuah objek Truk untuk truk Toyota 2015
            //dengan 40000 kilometer, dengan harga 120000000,
            //dengan penggerak empat-roda
            Truk trukKu = new Truk();
            trukKu.Buatan = "Toyota";
            trukKu.Model = "2015";
            trukKu.JarakKm = 40000;
            trukKu.Harga = 120000000;
            trukKu.Penggerak = "Penggerak Empat-Roda";

            //Menciptakan sebuah objek SUV untuk sebuah Volvo 2015
            //dengan 30000 kilometer, dengan harga 115000000,
            //dengan kapasitas penumpang 5.
            SUV SUVKu = new SUV();
            SUVKu.Buatan = "Volvo";
            SUVKu.Model = "2015";
            SUVKu.JarakKm = 30000;
            SUVKu.Harga = 115000000;
            SUVKu.Penumpang = 5;

            //Menampilkan data tentang mobil
            MessageBox.Show(mobilKu.Model + " " + mobilKu.Buatan + " dengan " +
                mobilKu.JarakKm + " Km, dengan harga Rp. " +
                mobilKu.Harga.ToString() + ", dengan " + mobilKu.Pintu +
                " doors.");

            // Display data about the truck.
            MessageBox.Show(trukKu.Model + " " + trukKu.Buatan +
                " with " + trukKu.JarakKm + " Km, dengan harga Rp. " +
                trukKu.Harga.ToString() + ", dengan " +
                trukKu.Penggerak);

            // Display data about the SUV.
            MessageBox.Show(SUVKu.Model + " " + SUVKu.Buatan + " with " +
                SUVKu.JarakKm + " Km, dengan harga Rp. " +
                SUVKu.Harga.ToString() + ", dengan " + SUVKu.Penumpang +
                " passengers.");
        }

        private void tombolKeluar_Click(object sender, EventArgs e)
        {
            //Menutup form
            this.Close();
        }
    }
}

Amati kode di dalam event handler tombolCiptakan_Click. Baris 24 menciptakan sebuah objek dari kelas Mobil, yang direferensi oleh variabel mobilKu. Baris 25-29 menugaskan nilai-nilai kepada properti Buatan, Model, JarakKm, Harga, dan Pintu.


Gambar 8.6 Kotak-kotak pesan yang ditampilkan pada projek Mobil Truk SUV


Baris 34 menciptakan sebuah objek dari kelas Truk, yang direferensi oleh variabel trukKu. Baris 35-39 menugaskan nilai-nilai kepada properti Buatan, Model, JarakKm, Harga, dan Penggerak.

Baris 44 menciptakan sebuah objek dari kelas SUV, yang direferensi oleh variabel SUVKu. Baris 45-49 menugaskan nilai-nilai kepada properti Buatan, Model, JarakKm, Harga, dan Penumpang.

Baris 52-55 menampilkan properti-properti dari objek mobilKu pada kotak pesan teratas yang ditunjukkan pada Gambar 8.6. Baris 58-61 properti-properti dari objek trukKu pada kotak pesan tengah yang ditunjukkan pada Gambar 8.6. Baris 6 Baris 64-67 menampilkan properti-properti dari objek SUVKu pada kotak pesan teratas yang ditunjukkan pada Gambar 8.6.

Tutorial 8.1: Menciptakan dan Menguji Kelas AkunSimpanan dan AkunSD
Bank Sistem Finansial, Inc mengembangkan piranti lunak finansial untuk bank dan kartu kredit. Perusahaan ini mengembangkan sebuah sistem baru yang mengelola akun konsumen. Salah satu tugasnya adalah mengembangkan sebuah kelas yang merepresentasikan akun simpanan. Data yang harus dimuat oleh kelas ini adalah
·         Nomor akun
·         Suku bunga
·         Saldo akun

Anda juga harus mengembangkan sebuah kelas yang merepresentasikan akun sertifikat deposit (SD). Data yang harus dimuat oleh sebuah objek dari kelas ini adalah
·         Nomor akun
·         Suku bunga
·         Saldo akun
·         Tanggal maturitas akun

Gambar 8.7 Form dari aplikasi Uji Akun SD

Jika Anda menganalisa persyaratan-persyaratan ini, Anda menyadari bahwa sebuah akun SD sebenarnya merupakan versi terspesialisasi dari akun simpanan. Kelas yang merepresentasikan sebuah SD akan memuat data yang sama dengan kelas yang merepresentasikan sebuah akun simpanan, ditambah dengan sebuah properti ekstra untuk tanggal maturitas. Anda memutuskan untuk menciptakan sebuah kelas AkunSimpanan untuk merepresentasikan sebuah akun simpanan dan kemudian menciptakan sebuah keals yang diderivasi dari AkunSimpanan, dinamai dengan AkunSD, untuk merepresentasikan sebuah akun SD.

Untuk menguji kelas-kelas ini, Anda akan menggunakannya di dalam suatu aplikasi sehingga user dapat memasukkan data tentang sebuah akun SD, menciptakan sebuah objek dari kelas AkunSD, menetapkan properti-properti dari objek menjadi data yang dimasukkan oleh user, dan kemudian menampilkan data objek. Form dari aplikasi, yang telah diciptakan untuk Anda, ditampilkan pada Gambar 8.7.

Langkah 1: Awali Visual Studio (atau Visual Studio Express). Buka projek dengan nama Uji Akun SD.

Langkah 2: Klik menu PROJECT pada batang menu Visual Studio dan kemudian klik Add Class…. Jendela Add New Item akan ditampilkan. Pastikan Class diseleksi sebagai tipe item. Ubah nama file default menjadi AkunSimpanan.cs dan kemudian klik pada tombol Add. Ini akan menambahkan sebuah kode sumber dengan nama AkunSimpanan.cs pada projek.

Langkah 3: File AkunSimpanan.cs sekarang akan ditampilkan pada editor kode. Sempurnakan kode untuk kelas AkunSimpanan dengan menuliskan baris 11-43 pada Program 8.3. Kode kelas ini cukup sederhana. Ia mendeklarasikan properti-properti dengan nama NomorAkun, SukuBunga, dan Saldo, berikut dengan bidang-bidang pendukung untuk properti-properti. Kelas ini juga memiliki sebuah konstruktor tanpa parameter yang menginisialisasi tiap bidang pendukung menjadi nilai defaultnya.

Langkah 4: Klik menu PROJECT pada batang menu Visual Studio dan kemudian klik Add Class…. Jendela Add New Item akan ditampilkan. Pastikan Class diseleksi sebagai tipe item. Ubah nama file default menjadi AkunSD.cs dan kemudian klik pada tombol Add. Ini akan menambahkan sebuah kode sumber dengan nama AkunSD.cs pada projek.

Langkah 5: File AkunSD.cs sekarang akan ditampilkan pada editor kode. Sempurnakan kode untuk kelas AkunSD sebagai berikut:
·         Di akhir dari header kelas, ketikkan : AkunSimpanan untuk mengindikasikan bahwa kelas ini diderivasi dari kelas AkunSimpanan. (Lihat baris 9 pada Program 8.4).
·         Ketikkan kode yang ditampilkan pada baris 11-25 pada Program 8.4. Kode kelas sangat sederhana. Ia mendeklarasikan sebuah properti dengan nama TanggalMaturitas berikut dengan bidang pendukungnya. Kelas ini juga memiliki sebuah konstruktor tanpa parameter yang menginisialisasi bidang pendukung menjadi sebuah string kosong.

Langkah 6: Buka file Form1.cs pada editor kode. Ketikkan komentar dan kode untuk metode GetDataSD, yang ditunjukkan pada baris 20-57 dari Program 8.5. Perhatikan pada baris 23 bahwa metode ini memiliki sebuah parameter AkunSD dengan nama akun. Ketika Anda memanggil metode ini, Anda melewatkan sebuah objek AkunSD sebagai argumen. Tujuan dari metode GetDataSD adalah untuk membaca data yang telah dimasukkan oleh user ke dalam kotak-kotak teks dan menyimpan data itu ke dalam properti-properti dari objek akun. Nilai-nilai yang telah dimasukkan untuk suku bunga dan saldo akan divalidasi.

Langkah 7: Selanjutnya Anda menciptakan event handler Click untuk kontrol-kontrol Button. Pergi ke mode Design dari form Form1. Klik ganda pada kontrol tombolCiptakan. Ini akan membuka file Form1.cs pada jendela editor kode dan Anda akan melihat sebuah event handler kosong dengan nama tombolCiptakan_Click. Sempurnakan event handler ini dengan menuliskan kode yang ditunjukkan pada baris 61-71 pada Program 8.5. Amati kode tersebut:

Baris 62: Statemen ini menciptakan sebuah objek AkunSD di dalam memori, yang direferensi oleh sebuah variabel dengan nama akunKu.

Baris 65: Statemen ini memanggil metode GetDataSD, yang melewatkan objek akunKu sebagai argumennya. Setelah metode dieksekusi, properti-properti dari objek akunKu akan ditetapkan menjadi nilai-nilai yang dimasukkan oleh user.


Gambar 8.8 Aplikasi Uji Akun SD

Baris 68-71: Statemen-statemen ini menampilkan nilai-nilai dari properti-properti objek akunKu.

Langkah 8: Kembali ke mode Design dari form Form1 dan klik ganda pada kontrol tombolKeluar. Pada editor kode, Anda akan melihat sebuah event handler kosong dengan nama tombolKeluar_Click. Sempurnakan event handler ini dengan mengetikkan kode yang ditunjukkan pada baris 76-77 pada Program 8.5.

Langkah 9: Simpan projek. Kemudian, tekan F5 atau klik Start Debugging pada toolbar untuk mengkompilasi dan menjalankan aplikasi. Ketika aplikasi dijalankan, masukkan data pada kontrol-kontrol TextBox dan klik tombol Ciptakan Objek. Anda akan melihat nilai-nilai yang Anda masukkan ditampilkan pada kotak grup Properti-Properti Objek. Gambar 8.8 menunjukkan salah satu keluaran aplikasi. Klik tombol Keluar untuk menghentikan aplikasi.

CATATAN: Properti TanggalMaturitas pada kelas AkunSD diimplementasikan sebagai sebuah string. Jika Anda inginkan, Anda dapat menggunakan tipe data DateTime yang disediakan oleh .NET Framework.

Program 8.3 Kode utuh untuk file AkunSimpanan.cs pada aplikasi Uji Akun SD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Uji_Akun_SD
{
    class AkunSimpanan
    {
         //Bidang-Bidang
        private string _nomorAkun;
        private decimal _sukuBunga;
        private decimal _saldo;

        //Konstruktor
        public AkunSimpanan()
        {
            _nomorAkun = "";
            _sukuBunga = 0;
            _saldo = 0;
        }

        //Properti NomorAkun
        public string NomorAkun
        {
            get { return _nomorAkun; }
            set { _nomorAkun = value; }
        }

        //Properti SukuBunga
        public decimal SukuBunga
        {
            get { return _sukuBunga; }
            set { _sukuBunga = value; }
        }

        //Properti Saldo
        public decimal Saldo
        {
            get { return _saldo; }
            set { _saldo = value; }
        }
    }
}

Program 8.4 Kode utuh untuk file AkunSD pada projek Uji Akun SD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Uji_Akun_SD
{
    class AkunSD : AkunSimpanan
    {
         //Bidang
        private string _tanggalMaturitas;

        //Konstruktor
        public AkunSD()
        {
            _tanggalMaturitas = "";
        }

        //Properti TanggalMaturitas
        public string TanggalMaturitas
        {
            get { return _tanggalMaturitas; }
            set { _tanggalMaturitas = value; }
        }
    }
}

Program 8.5 Kode utuh untuk Form1 pada aplikasi Uji Akun SD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Uji_Akun_SD
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //Metode GetDataSD menerima sebuah objek AkunSD
        //sebagai sebuah argumen. Ia menugaskan data yang dimasukkan
        //user kepada properti-properti objek
        private void GetDataSD(AkunSD akun)
        {
            //Variabel-variabel temporer untuk memuat suku bunga
            //dan saldo
            decimal sukuBunga;
            decimal saldo;

            //Membaca nomor akun
            akun.NomorAkun = teksNomorAkun.Text;

            //Membaca tanggal maturitas
            akun.TanggalMaturitas = teksTanggalMaturitas.Text;

            //Membaca suku bunga
            if (decimal.TryParse(teksSukuBunga.Text, out sukuBunga))
            {
                akun.SukuBunga = sukuBunga;

                //Membaca saldo
                if (decimal.TryParse(teksSaldo.Text, out saldo))
                {
                    akun.Saldo = saldo;
                }
                else
                {
                    //Menampilkan pesan error
                    MessageBox.Show("Saldo tidak valid");
                }
            }
            else
            {
                //Menampilkan pesan error
                MessageBox.Show("Suku bunga tidak valid");
            }
        }

        private void tombolCiptakan_Click(object sender, EventArgs e)
        {
            //Menciptakan sebuah objek AkunSD
            AkunSD akunKu = new AkunSD();

             //Membaca data akun SD
            GetDataSD(akunKu);

            //Menampilkan data akun SD
            labelNomorAkun.Text = akunKu.NomorAkun;
            labelSukuBunga.Text = akunKu.SukuBunga.ToString("n2");
            labelSaldo.Text = "Rp. " + akunKu.Saldo.ToString();
            labelTanggalMaturitas.Text = akunKu.TanggalMaturitas;
        }

        private void tombolKeluar_Click(object sender, EventArgs e)
        {
            //Menutup form
            this.Close();
        }
    }
}


Konstruktor Kelas Basis dan Konstruktor Kelas Terderivasi
Ketika Anda menciptakan sebuah objek dari kelas terderivasi, konstruktor kelas basis akan dieksekusi lebih dahulu, dan kemudian konstruktor kelas terderivasi barulah dieksekusi. Pada contoh-contoh yang telah didiskusikan sejauh ini, kelas basis dan kelas terderivasi memiliki konstruktor tanpa parameter. Ketika Anda menciptakan sebuah objek dari kelas terderivasi, secara default konstruktor tanpa parameter dari kelas basis secara otomatis dieksekusi.

Tetapi apa yang terjadi jika konstruktor dari kelas basis memiliki parameter? Atau, apa yang terjadi jika kelas basis memiliki sejumlah konstruktor terbebani (overloaded) dan Anda ingin memastikan salah satu konstruktor itu dipanggil? Pada situasi semacam itu, konstruktor kelas terderivasi harus secara eksplisit memanggil konstruktor kelas basis.

Sebagai contoh, lihat kelas PersegiPanjang berikut:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class PersegiPanjang
{
   //Bidang-bidang
   private int _panjang;
   private int _lebar;

   //Konstruktor
   public PersegiPanjang()
   {
       _panjang = 0;
       _lebar = 0;
    }

    //Konstruktor
    public PersegiPanjang(int panjang, int lebar)
    {
       _panjang = panjang;
       _lebar = lebar;
    }

    //Properti Panjang
    public int Panjang
    {
       get { return _panjang; }
       set { _panjang = value; }
    }

    //Properti Lebar
    public int Lebar
    {
       get { return _lebar; }
       set { _lebar = value; }
    }
}

Kelas ini memuat data tentang persegi-panjang. Ia memiliki properti Panjang dan Lebar untuk menyimpan panjang dan lebar dari sebuah persegi-panjang. Ia memiliki dua konstruktor: sebuah konstruktor tanpa parameter (baris 8-12) yang menginisialisasi _panjang dan _lebar menjadi 0 dan sebuah konstruktor yang menerima argumen-argume untuk panjang dan lebar (baris 15-19).

Kelas Kotak berikut diderivasi dari kelas PersegiPanjang:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Kotak : PersegiPanjang
{
   //Bidang
   private int _tinggi;

   //Konstruktor
   public Kotak()
   {
      _tinggi = 0;
   }

   //Konstruktor
   public Kotak(int panjang, int lebar, int tinggi)
      : base(panjang, lebar)
   {
      _tinggi = tinggi;
   }

   //Properti Tinggi
   public int Tinggi
   {
      get { return _tinggi; }
      set { _tinggi = value; }
   }
}

Kelas Kotak memuat data tentang kotak persegi-panjang, yang memiliki lebar, panjang, dan tinggi. Kelas ini mewarisi properti Panjang dan Lebar dari kelas PersegiPanjang, dan ia memiliki properti Tinggi-nya sendiri. Perhatikan bahwa kelas Kotak memiliki dua konstruktor: sebuah konstruktor tanpa parameter (baris 7-10) dan sebuah konstruktor berparameter (baris 13-17).

Jika Anda menciptakan sebuah objek dari kelas Kotak, dengan memanggil konstruktor tanpa parameter, maka konstruktor tanpa parameter dari kelas PersegiPanjang akan dieksekusi. Berikut adalah salah satu contohnya:

Kotak kotakKu = new Kotak();

Setelah statemen ini dieksekusi, properti Panjang, Lebar, dan Tinggi dari objek kotakKu akan ditetapkan menjadi 0.

Sekarang, lihat konstruktor berparameter dari kelas Kotak. Kode berikut ditampilkan pada baris 13:

public Kotak(int panjang, int lebar, int tinggi)

Konstruktor ini memiliki tiga parameter: panjang, lebar, dan tinggi. Perhatikan kode berikut pada baris 14:

: base(panjang, lebar)

Katakunci base merujuk pada kelas basis. Ini merupakan pemanggilan eksplisit terhadap konstruktor berparameter dari kelas basis, yang melewatkan panjang dan lebar sebagai argumen. Untuk memahami bagaimana hal ini bekerja, perhatikan statemen berikut:

Kotak kotakKu = new Kotak(100, 200, 300);

Statemen ini menciptakan sebuah objek dari kelas Kotak, yang melewatkan 100 kepada parameter panjang, 200 kepada parameter lebar, dan 300 kepada parameter tinggi. Kode pada baris 14 dari kelas Kotak memanggil konstruktor berparameter dari kelas PersegiPanjang, yang melewatkan panjang dan lebar sebagai argumen. Seteleh konstruktor dari kelas PersegiPanjang dieksekusi, konstruktor dari kelas Kotak akan dieksekusi. Properti Panjang dari objek Kotak yang dihasilkan akan ditetapkan 100, properti Lebar-nya akan ditetapkan 200, dan properti Tinggi-nya akan ditetapkan 300.



8.2 Polimorfisme
KONSEP: Polimorfisme digunakan agar kelas-kelas terderivasi dapat memiliki metode-metode dengan nama sama sebagai metode-metode pada kelas basisnya. Ini memberikan kemampuan bagi sebuah program untuk memanggil metode yang tepat, tergantung dari tipe objek yang digunakan untuk memanggilnya.

Istilah polimorfisme mengacu pada kemampuan objek dalam mengambil sejumlah bentuk. Ini merupakan fitur tangguh dalam pemrograman beroerientasi objek. Pada bagian ini, Anda akan mempelajari dua bumbu spesial dari watak polimorfik:
1.      Kemampuan untuk mendefinisikan sebuah metode di dalam kelas basis dan kemudian mendefinisikan sebuah metode dengan nama sama di dalam kelas terderivasi. Ketika metode dari kelas terderivasi memiliki nama sama dengan metode dari kelas basis, hal ini dikatakan bahwa metode kelas basis mendefinisikan-ulang metode kelas basis.
2.      Kemampuan untuk memanggil versi yang tepat dari metode yang didefinisikan-ulang, tergantung dari tipe objek yang dipakai untuk memanggilnya. Jika sebuah objek kelas terderivasi dipakai untuk memanggil, maka versi metode dari kelas terderivasi yang akan dieksekusi. Jika sebuah objek kelas basis dipakai untuk memanggil, maka versi metode dari kelas basis yang akan dieksekusi.

Cara terbaik dalam menjelaskan polimorfisme adalah dengan mendemonstrasikannya. Jadi, Anda akan mempelajari contoh sederhana ini. Lihat kode berikut untuk kelas Binatang:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Binatang
{
   //Bidang
   private string _spesies;

   //Konstruktor
   public Binatang(string spesies)
   {
      _spesies = spesies;
   }

   //Properti Spesies
   public string Spesies
   {
      get { return _spesies; }
      set { _spesies = value; }
   }

   //Metode BuatSuara
   public virtual void BuatSuara()
   {
      MessageBox.Show("Grrrrrrr");
   }
}

Baris 4 mendeklarasikan bidang string dengan nama _spesies. Ini merupakan bidang pendukung untuk properti Spesies, yang didefinisikan pada baris 13-17. Konstruktor pada baris 7-10 mengambil sebuah argumen yang ditugaskan kepada bidang _spesies.

Kelas ini memiliki sebuah metode dengan nama BuatSuara, pada baris 20-23. Metode ini menampilkan “Grrrrrrr” pada sebuah kotak dialog. Perhatikan katakunci virtual yang ada pada header metode. Katakunci virtual mendeklarasikan bahwa sebuah kelas terderivasi diijinkan untuk mendefinisikan-ulang metode ini.

Berikut adalah sebuah contoh kode yang menggunakan sebuah objek dari kelas Binatang:

1
2
3
Binatang binatangKu = new Binatang("binatang biasa");
MessageBox.Show("Spesies ini adalah " + binatangKu.Spesies);
binatangKu.BuatSuara();

Statemen pada baris 1 menciptakan sebuah objek dari kelas Binatang, yang melewatkan string “binatang biasa” kepada konstruktor. Objek ini direferensi oleh variabel binatangKu. Baris 2 menampilkan “Spesies ini adalah binatang biasa” pada sebuah kotak dialog. Baris 3 memanggil metode BuatSuara dari objek binatangKu, yang menampilkan “Grrrrrr” pada sebuah kotak dialog. Selanjutnya, lihat pada kelas Anjing, yang diderivasi dari kelas Binatang:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Anjing : Binatang
{
   //Bidang
   private string _nama;

   //Konstruktor
   public Anjing(string nama) : base ("Anjing")
   {
       _nama = nama;
   }

   //Properti Nama
   public string Nama
   {
      get { return _nama; }
      set { _nama = value; }
   }

   //Metode BuatSuara
   public override void BuatSuara()
   {
      MessageBox.Show("Guk! Guk!");
   }
}

Baris 4 mendeklarasikan bidang string dengan nama _nama. Ini merupakan bidang pendukung untuk properti Nama, yang didefinisikan pada baris 13-17. Konstruktor pada baris 7-10 mengambil sebuah argumen untuk nama anjing. Perhatikan bahwa konstruktor memanggil konstruktor kelas basis, yang melewatkan string “Anjing” sebagai argumennya. Konstruktor kelas Binatang menugaskan string “Anjing” kepada bidang _spesies.

Meskipun kelas Anjing diderivasi dari kelas Binatang, metode BuatSuara dari kelas Binatang tidak cukup untuk kelas Anjing. Jadi, kelas Anjing mendefinisikan ulang metode BuatSuara dari kelas Binatang. Metode BuatSuara dari kelas Anjing, pada baris 20-23, menampilkan “Guk! Guk!” pada sebuah kotak dialog, yang lebih cocok untuk seekor anjing. Perhatikan bahwa katakunci override ditampilkan pada header metode. Katakunci override mendeklarasikan bahwa metode ini mendefinisikan sebuah metode pada kelas basis.

Berikut adalah sebuah contoh kode yang menggunakan suatu objek dari kelas Anjing:

1
2
3
4
Anjing anjingKu = new Anjing("Jaultop");
MessageBox.Show("Spesies ini adalah " + anjingKu.Spesies);
MessageBox.Show("Nama binatang ini adalah " + anjingKu.Nama);
anjingKu.BuatSuara();

Statemen pada baris 1 mendeklarasikan sebuah objek dari kelas Anjing, yang melewatkan string “Jaultop” kepada konstruktor. Objek ini direferensi oleh variabel anjingKu. Baris 2 menampilkan “Spesies ini adalah Anjing” pada sebuah kotak dialog. Baris 3 menampilkan “Nama binatang ini adalah “Jaultop” pada sebuah kotak dialog. Baris 4 memanggil metode BuatSuara dari objek anjingKu. Ketika Anda menggunakan sebuah objek Anjing untuk memanggil metode BuatSuara, maka versi metode yang ada pada kelas Anjing adalah yang dieksekusi. Jadi, statemen pada baris 4 menampilkan “Guk! Guk!” pada suatu kotak dialog.

Selanjutnya, lihat pada kelas Kucing, yang juga diderivasi dari kelas Binatang:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Kucing : Binatang
{
   //Bidang
   private string _nama;

   //Konstruktor
   public Kucing(string nama) : base ("Kucing")
   {
       _nama = nama;
   }

   //Properti Nama
   public string Nama
   {
      get { return _nama; }
      set { _nama = value; }
   }

   //Metode BuatSuara
   public override void BuatSuara()
   {
      MessageBox.Show("Meong! Meong!");
   }
}

Baris 4 mendeklarasikan bidang string dengan nama _nama. Ini merupakan bidang pendukung untuk properti Nama, yang didefinisikan pada baris 13-17. Konstruktor pada baris 7-10 mengambil sebuah argumen untuk nama kucing. Perhatikan bahwa konstruktor memanggil konstruktor kelas basis, yang melewatkan string “Kucing” sebagai argumennya. Konstruktor kelas Binatang menugaskan string “Kucing” kepada bidang _spesies.

Meskipun kelas Kucing diderivasi dari kelas Binatang, metode BuatSuara dari kelas Binatang tidak cukup untuk kelas Kucing. Jadi, kelas Anjing mendefinisikan ulang metode BuatSuara dari kelas Binatang. Metode BuatSuara dari kelas Kucing, pada baris 20-23, menampilkan “Meong! Meong!” pada sebuah kotak dialog, yang lebih cocok untuk seekor kucing. Perhatikan bahwa katakunci override ditampilkan pada header metode. Katakunci override mendeklarasikan bahwa metode ini mendefinisikan sebuah metode pada kelas basis.

Berikut adalah sebuah contoh kode yang menggunakan suatu objek dari kelas Kucing:

1
2
3
4
Kucing kucingKu = new Kucing("Kati");
MessageBox.Show("Spesies ini adalah " + kucingKu.Spesies);
MessageBox.Show("Nama binatang ini adalah " + kucingKu.Nama);
kucingKu.BuatSuara();

Statemen pada baris 1 mendeklarasikan sebuah objek dari kelas Kucing, yang melewatkan string “Kati” kepada konstruktor. Objek ini direferensi oleh variabel kucingKu. Baris 2 menampilkan “Spesies ini adalah Kucing” pada sebuah kotak dialog. Baris 3 menampilkan “Nama binatang ini adalah “Kati” pada sebuah kotak dialog. Baris 4 memanggil metode BuatSuara dari objek kucingKu. Ketika Anda menggunakan sebuah objek Kucing untuk memanggil metode BuatSuara, maka versi metode yang ada pada kelas Kucing adalah yang dieksekusi. Jadi, statemen pada baris 4 menampilkan “Meong! Meong!” pada suatu kotak dialog.

Karena relasi “adalah suatu” antara kelas basis dan kelas terderivasi, sebuah objek dari kelas Anjing bukan hanya objek Anjing. Ia juga merupakan objek Binatang. (Anjing adalah binatang). Karena relasi ini, Anda dapat menggunakan suatu variabel kelas Binatang untuk mereferensi objek Anjing.

Sebagai contoh, lihat kode berikut:

1
2
3
Binatang binatangKu = new Anjing("Jaultop");
MessageBox.Show("Spesies ini adalah " + binatangKu.Spesies);
binatangKu.BuatSuara();

Baris 1 mendeklarasikan binatangKu sebagai suatu variabel bertipe Binatang. Ia juga menciptakan suatu objek dari kelas Anjing dan menugaskan suatu referensi yang menunjuk ke objek Anjing kepada variabel binatangKu. Setelah statemen ini dieksekusi, Anda akan memiliki sebuah variabel Binatang yang mereferensi suatu objek Anjing. Penugasan ini legal karena sebuah objek Anjing juga merupakan suatu objek Binatang. Baris 2 menampilkan “Spesies ini adalah Anjing” pada suatu kotak dialog. Baris 3 memanggil metode BuatSuara dari objek binatangKu, yang menampilkan “Guk! Guk!” pada sebuah kotak dialog.

Sama halnya, Anda dapat menggunakan sebuah variabel Binatang untuk mereferensi suatu objek Kucing, seperti ditunjukkan pada kode berikut:


1
2
3
Binatang binatangKu = new Kucing("Kati");
MessageBox.Show("Spesies ini adalah " + binatangKu.Spesies);
binatangKu.BuatSuara();

Statemen pada baris 2 menampilkan “Spesies ini adalah Kucing” pada suatu kotak dialog. Baris 3 memanggil metode BuatSuara dari objek binatangKu, yang menampilkan “Meong! Meong!” pada suatu kotak dialog.

Mendefinisikan Ulang Properti
Properti-properti pada suatu kelas basis dapat didefinisikan ulang dengan cara yang sama dengan pendefinisian-ulang metode. Pada kelas basis, Anda menuliskan katakunci virtual pada deklarasi properti, seperti ditunjukkan berikut:

public virtual double Berat
{
   get { return _berat; }
   set { _berat = value; }
}

Contoh ini mendeklarasikan sebuah properti virtual dengan nama Berat. Untuk mendefinisikan ulang properti pada kelas terderivasi, Anda menuliskan katakunci override pada deklarasi properti. Sebagai contoh, dimisalkan bahwa pada suatu kelas terderivasi Anda ingin mendefinisikan ulang properti Berat sehingga eksesor get menghasilkan berat di bulan. Berikut adalah salah satu contohnya:

public override double Berat
{
   get { return _berat * 0.165; }
   set { _berat = value; }
}

Variabel Referensi Kelas Basis Hanya Mengenal Anggota-Anggota Kelas Basis
Sebuah variabel referensi kelas basis dapat mereferensi suatu objek dari setiap kelas yang diderivasi dari kelas basis. Namun, ada pembatasan pada apa yang dapat dilakukan oleh variabel kelas basis terhadap objek-objek itu. Sebuah referensi kelas basis hanya mengenal anggota-anggota yang dideklarasikan di dalam kelas basis. Jika kelas terderivasi memiliki metode, properti, atau bidang tambahan, maka variabe kelas basis tidak dapat mengaksesnya. Sebagai contoh, lihat pada kode berikut:

1
2
3
4
Binatang binatangKu = new Anjing("Jaultop");
MessageBox.Show("Spesies ini adalah " + binatangKu.Spesies);
MessageBox.Show("Nama binatang ini adalah " + binatangKu.Nama); // ERROR!
binatangKu.BuatSuara();

Baris 3 pada kode ini tidak akan bisa dikompilasi. Variabel binatangKu adalah sebuah variabel referensi Binatang dan kelas Binatang tidak memiliki properti Nama. Meskipun variabel binatangKu mereferensi suatu kelas Anjing, ia tidak dapat mengakses properti Nama dari objek itu.

Relasi “Adalah Suatu” Tidak Dapat Diterapkan Terbalik
Adalah penting untuk memahami bahwa relasi “adalah suatu” tidak dapat diterapkan secara terbalik. Meskipun statemen “anjing adalah suatu binatang” berlaku, statemen “binatang adalah suatu anjing” tidak berlaku. Ini karena semua anjing adalah binatang, tetapi tidak semua binatang adalah anjing. Jadi, statemen berikut tidak akan bisa dikompilasi:

Anjing anjingKu = new Binatang(“Anjing”);

Anda tidak bisa menugaskan sebuah referensi Binatang kepada variabel Anjing. Ini masuk akal karena objek-objek Anjing memiliki kapabilitas yang melebihi dari objek-objek Binatang.

Melewatkan Objek Kepada Parameter Kelas Basis
Polimorfisme memberikan Anda fleksibilitas ketika mendesain aplikasi. Sebagai contoh, lihat metode berikut:

private void TampilInfoBinatang(Binatang binatang)
{
   MessageBox.Show("Spesies: " + binatang.Spesies);
   binatang.BuatSuara();
}

Metode ini menampilkan informasi tentang suatu binatang. Karena ia memiliki sebuah variabel Binatang sebagai parameternya, Anda dapat melewatkan sebuah objek Binatang kepada metode itu ketika Anda memanggilnya. Metode ini kemudian menampilkan properti Spesies dari objek dan memanggil metode BuatSuara dari objek itu.

Metode TampilInfoBinatang bekerja pada objek Binatang, tetapi bagaimana jika Anda memerlukan metode yang menampilkan informasi yang sama tentang objek Anjing dan objek Kucing? Apakah Anda perlu menuliskan metode lain untuk tiap tipe ini? Dengan polimorfisme, jawabannya adalah tidak. Selain objek Binatang, Anda juga dapat melewatkan objek Anjing atau objek Kucing sebagai argumen kepada metode TampilInfoBinatang.

Pada Tutorial 8.2, Anda akan menciptakan sebuah aplikasi yang menggunakan kelas Binatang, Anjing, dan Kelas untuk mendemonstrasikan polimorfisme.

Tutorial 8.2: Menciptakan Aplikasi Polimorfisme
Pada tutorial ini, Anda menciptakan aplikasi Polimorfisme, yang mendemonstrasikan kelas Binatang, Anjing, dan Kucing yang telah ditunjukkan pada bagian ini. Aplikasi ini juga akan menggunakan metode TampilInfoBinatang seperti yang telah dijelaskan.

Form aplikasi, yang telah diciptakan bagi Anda, ditampilkan pada Gambar 8.9. Ketika Anda menjalankan aplikasi, pengklikan tombol Ciptakan Binatang akan menciptakan suatu objek dari kelas Binatang dan melewatkan objek itu kepada metode TampilInfoBinatang. Pengklikan tombol Ciptakan Anjing akan menciptakan suatu objek dari kelas Anjing dan melewatkan objek itu kepada metode TampilInfoBinatang. Pengklikan tombol Ciptakan Kucing akan menciptakan suatu objek dari kelas Anjing dan melewatkan objek itu kepada metode TampilInfoBinatang.

Langkah 1: Awali Visual Studio (atau Visual Studio Express). Buka projek dengan nama Demo Polimorfisme.

Langkah 2: Klik PROJECT pada batang menu Visual Studio dan kemudian seleksi Add Class…. Jendela Add New Item akan ditampilkan. Pastikan Class diseleksi sebagai tipe item. Ubah nama default menjadi Binatang.cs dan klik tombol Add. Ini akan menambahkan file dengan nama Binatang.cs pada projek.

Gambar 8.9 Form aplikasi Demo Polimorfisme

Langkah 3: File Binatang.cs sekarang akan ditampilkan pada editor kode. Tambahkan direktif using pada baris 6 pada Program 8.6. Ini diperlukan agar kelas ini dapat memanggil metode MessageBox.Show. Selanjutnya, sempurnakan kode untuk kelas Binatang dengan mengetikkan baris 12-32 pada Program 8.6.

Program 8.6 Kode utuh untuk file Binatang.cs pada projek Demo Polimorfisme
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; //Diperlukan untuk MessageBox

namespace Demo_Polimorfisme
{
    class Binatang
    {
        //Bidang
        private string _spesies;

        //Konstruktor
        public Binatang(string spesies)
        {
            _spesies = spesies;
        }

        //Properti Spesies
        public string Spesies
        {
            get { return _spesies; }
            set { _spesies = value; }
        }

        //Metode BuatSuara
        public virtual void BuatSuara()
        {
            MessageBox.Show("Grrrrrrr");
        }
    }
}

Langkah 4: Klik PROJECT pada batang menu Visual Studio dan kemudian seleksi Add Class…. Jendela Add New Item akan ditampilkan. Pastikan Class diseleksi sebagai tipe item. Ubah nama default menjadi Anjing.cs dan klik tombol Add. Ini akan menambahkan file dengan nama Anjing.cs pada projek.

Langkah 5: File Anjing.cs sekarang akan ditampilkan pada editor kode. Tambahkan direktif using pada baris 6 pada Program 8.7. Ini diperlukan agar kelas ini dapat memanggil metode MessageBox.Show. Selanjutnya, tambahkan notasi : Binatang pada header kelas, seperti ditunjukkan pada baris 10 dari Program 8.7. Kemudian, sempurnakan kode untuk kelas Anjing dengan mengetikkan baris 12-33 pada Program 8.7.

Program 8.7 Kode utuh untuk file Anjing.cs pada projek Demo Polimorfisme
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; //Diperlukan untuk MessageBox

namespace Demo_Polimorfisme
{
    class Anjing : Binatang
    {
        //Bidang
        private string _nama;

        //Konstruktor
        public Anjing(string nama)
            : base("Anjing")
        {
            _nama = nama;
        }

        //Properti Nama
        public string Nama
        {
            get { return _nama; }
            set { _nama = value; }
        }

        //Metode BuatSuara
        public override void BuatSuara()
        {
            MessageBox.Show("Guk! Guk!");
        }
    }
}

Langkah 6: Klik PROJECT pada batang menu Visual Studio dan kemudian seleksi Add Class…. Jendela Add New Item akan ditampilkan. Pastikan Class diseleksi sebagai tipe item. Ubah nama default menjadi Kucing.cs dan klik tombol Add. Ini akan menambahkan file dengan nama Kucing.cs pada projek.

Langkah 7: File Kucing.cs sekarang akan ditampilkan pada editor kode. Tambahkan direktif using pada baris 6 pada Program 8.8. Ini diperlukan agar kelas ini dapat memanggil metode MessageBox.Show. Selanjutnya, tambahkan notasi : Binatang pada header kelas, seperti ditunjukkan pada baris 10 dari Program 8.8. Kemudian, sempurnakan kode untuk kelas Kucing dengan mengetikkan baris 12-33 pada Program 8.8.

Program 8.8 Kode utuh untuk file Kucing.cs pada projek Demo Polimorfisme
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; //Diperlukan untuk MessageBox

namespace Demo_Polimorfisme
{
    class Kucing : Binatang
    {
        //Bidang
        private string _nama;

        //Konstruktor
        public Kucing(string nama)
            : base("Kucing")
        {
            _nama = nama;
        }

        //Properti Nama
        public string Nama
        {
            get { return _nama; }
            set { _nama = value; }
        }

        //Metode BuatSuara
        public override void BuatSuara()
        {
            MessageBox.Show("Meong! Meong!");
        }
    }
}

Langkah 8: Buka Form1.cs pada editor kode. Ketikkan komentar dan kode untuk metode TampilInfoBinatang yang ditunjukkan pada baris 20-27 dari Program 8.9.

Langkah 9: Selanjutnya Anda menciptakan event handler Click untuk kontrol-kontrol Button. Ganti view untuk form Form1 pada Designer. Klik ganda pada kontrol tombolCiptakanBinatang. Ini akan membuka file Form1.cs pada editor kode, dan Anda akan melihat sebuah event handler kosong dengan nama tombolCiptakanBinatang_Click. Sempurnakan event handler dengan mengetikkan kode yang ditunjukkan pada baris 31-32 pada Program 8.9.

Amati kode ini. Baris 31 menciptakan sebuah objek dari kelas Binatang, yang melewatkan “Binatang biasa” sebagai argumen kepada konstruktor. Baris 32 melewatkan objek itu kepada metode TampilInfoBinatang.

Langkah 10: Tukar view Anda ke form Form1 pada Designer. Klik ganda pada kontrol tombolCiptakanAnjing. Ini akan membuka file Form1.cs pada editor kode, dan Anda akan melihat sebuah event handler kosong dengan nama tombolCiptakanAnjing_Click. Sempurnakan event handler dengan mengetikkan kode yang ditampilkan pada baris 37-39 pada Program 8.9. Amati kode ini. Baris 37 menciptakan sebuah objek dari kelas Anjing, yang melewatkan “Jaultop” sebagai argumen kepada konstruktor. Baris 38 menampilkan properti Nama dari objek pada suatu kotak dialog. Baris 39 melewatkan objek itu kepada metode TampilInfoBinatang.

Langkah 11: Tukar view Anda ke form Form1 pada Designer. Klik ganda pada kontrol tombolCiptakanKucing. Ini akan membuka file Form1.cs pada editor kode, dan Anda akan melihat sebuah event handler kosong dengan nama tombolCiptakanKucing_Click. Sempurnakan event handler dengan mengetikkan kode yang ditampilkan pada baris 44-46 pada Program 8.9. Amati kode ini. Baris 44 menciptakan sebuah objek dari kelas Kucing, yang melewatkan “Kati” sebagai argumen kepada konstruktor. Baris 45 menampilkan properti Nama dari objek pada suatu kotak dialog. Baris 46 melewatkan objek itu kepada metode TampilInfoBinatang.

Langkah 12: Tukar view Anda ke form Form1 pada Designer. Klik ganda pada kontrol tombolKeluar. Ini akan membuka file Form1.cs pada editor kode, dan Anda akan melihat sebuah event handler kosong dengan nama tombolKeluar_Click. Sempurnakan event handler dengan mengetikkan kode yang ditampilkan pada baris 51-52 pada Program 8.9.

Langkah 13: Jalankan aplikasi.

Program 8.9 Kode utuh untuk Form1 pada aplikasi Demo Polimorfisme
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Demo_Polimorfisme
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //Metode TampilInfoBinatang menerima sebuah objek Binatang
        //sebagai argumen. Ia menampilkan spesies objek dan
        //memanggil metode BuatSuara-nya.
        private void TampilInfoBinatang(Binatang binatang)
        {
            MessageBox.Show("Spesies: " + binatang.Spesies);
                binatang.BuatSuara();
        }

        private void tombolCiptakanBinatang_Click(object sender, EventArgs e)
        {
            Binatang binatangKu = new Binatang("Binatang biasa");
            TampilInfoBinatang(binatangKu);
        }

        private void tombolCiptakanAnjing_Click(object sender, EventArgs e)
        {
            Anjing anjingKu = new Anjing("Jaultop");
            MessageBox.Show("Nama anjing adalah " + anjingKu.Nama);
            TampilInfoBinatang(anjingKu);
        }

        private void tombolCiptakanKucing_Click(object sender, EventArgs e)
        {
            Kucing kucingKu = new Kucing("Kati");
            MessageBox.Show("Nama kucing adalah " + kucingKu.Nama);
            TampilInfoBinatang(kucingKu);
        }

        private void tombolKeluar_Click(object sender, EventArgs e)
        {
            //Menutup form
            this.Close();
        }
    }
}



8.3 Kelas Abstrak
KONSEP: Kelas abstrak berperan sebagai kelas basis tetapi tidak bisa diinstansiasi atau tidak bisa dipakai untuk menciptakan objek. Metode abstrak tidak memiliki tubuh dan harus didefinisikan ulang pada suatu kelas terderivasi.

Sebuah kelas yang tidak ditujukan untuk diinstansiasi (untuk menciptakan objek) tetapi yang hanya dipakai sebagai kelas basis dinamakan kelas abstrak. Kelas abstrak berperan sebagai titik awal, yang menyediakan sejumlah anggota-anggota untuk kelas-kelas terderivasi. Untuk mendeklarasikan sebuah kelas sebagai kelas abstrak, Anda menggunakan katakunci abstract pada header kelas. Berikut adalah bentuk umumnya:

abstract class NamaKelas
{
    //Deklarasi-deklarasi anggota
}

Perbedaan utama antara kelas abstrak dan kelas biasa (yang kadangkala disebut pula sebagai kelas konkrit) adalah bahwa kelas abstrak tidak bisa diinstansiasi (tidak bisa dipakai untuk menciptakan objek). Suatu statemen yang mencoba menggunakan operator new untuk menginstansiasi sebuah kelas abstrak tidak akan bisa dikompilasi.

Kelas abstrak juga dapat memuat metode-metode abstrak. Metode abstrak adalah sebuah metode yang ditampilkan pada suatu kelas basis tetapi harus didefinisikan ulang pada kelas terderivasi. Metode abstrak hanya memiliki header dan tanpa tubuh. Pada headernya, katakunci abstract ditampilkan sebelum tipe nilai balik. Berikut adalah suatu contoh sederhana dari kelas abstraik yang memuat sebuah metode abstrak:

abstract class Orang
{
    public abstract void LakukanSesuatu();
}

Ketika sebuah metode abstrak ada di dalam suatu kelas, ia harus didefinisikan-ulang pada setiap kelas yang diderivasi dari kelas itu. Pada contoh ini, jika sebuah kelas diderivasi dari kelas Orang, maka kelas terderivasi itu harus mendefinisikan-ulang metode LakukanSesuatu.

Kelas abstrak juga dapat memuat properti abstrak. Properti abstrak adalah sebuah properti yang ada di dalam kelas basis tetapi harus didefinisikan ulang pada kelas terderivasi. Pada header properti, katakunci abstract harus diberikan sebelum tipe properti. Berikut adalah sebuah contoh sederhana dari sebuah kelas abstrak yang memuat properti abstrak:

abstract class Orang
{
   public abstract string Pekerjaan
   {
      get;
      set;
   }
}

Perhatikan bahwa properti abstrak menunjukkan aksesor get dan set, tetapi ia tidak menetapkan apa yang dilakukan aksesor tersebut. Ketika sebuah properti abstrak ada di dalam suatu kelas, ia harus didefinisikan oleh setiap kelas yang diderivasi dari kelas itu. Pada contoh ini, jika sebuah kelas diderivasi dari kelas Orang, maka kelas terderivasi harus mendefinisikan ulang properti Pekerjaan.

Pada Tutorial 8.3, Anda menciptakan sebuah aplikasi yang menggunakan kelas basis abstrak dengan sebuah properti abstrak.

Tutorial 8.3: Menciptakan Aplikasi Mahasiswa Ilmu Komputer
Pada tutorial ini, Anda akan menuliskan sebuah kelas abstrak dengan nama Mahasiswa. Kelas Mahasiswa memuat data yang umum ada pada semua mahasiswa, tetapi ia tidak memuat semua data yang diperlukan untuk mahasiswa dengan jurusan spesifik. Kelas Mahasiswa dimaksudkan sebagai kelas basis yang dapat diderivasi oleh kelas-kelas lain yang merepresentasikan mahasiswa-mahasiswa dengan jurusan spesifik.

Kelas Mahasiswa memiliki sebuah properti Nama untuk memuat nama mahasiswa dan sebuah properti ID untuk memuat nomor ID mahasiswa. Ia juga memiliki sebuah properti abstrak read-only dengan nama JamDiperlukan. Tujuan dari properti JamDiperlukan adalah untuk memuat jumlah jam yang diperlukan untuk jurusan tertentu. Setiap kelas yang diderivasi dari kelas Mahasiswa harus mendefinisikan ulang properti JamDiperlukan.

Anda juga akan menuliskan sebuah kelas dengan nama MahasiswaIlmuKomp, yang diderivai dari kelas Mahasiswa. Kelas MahasiswaIlmuKomp memiliki sebuah bidang dengan nama JejakAkademik, yang memuat nama dari jejak akademik mahasiswa. Ia juga menyediakan properti JamDiperlukan untuk menghitung dan menghasilkan jumlah jam yang diperlukan untuk jurusan ilmu komputer.

Anda akan mendemonstrasikan kelas-kelas pada aplikasi Mahasiswa Ilmu Komputer. Form aplikasi, yang telah disediakan bagi Anda, ditampilkan pada Gambar 8.10. Ketika Anda menyelasaikan aplikasi, Anda akan memasukkan nama mahasiswa dan nomor ID ke dalam kotak-kotak teks, dan Anda akan memilih jejak akademik menggunakan tombol-tombol radio. Ketika Anda mengklik tombol Baca Jam Diperlukan, aplikasi akan menciptakan sebuah objek MahasiswaIlmuKomp, yang diinisialisasi dengan data yang Anda masukkan. Ia kemudian akan membaca nilai dari properti JamDiperlukan dan menampilkannya pada form.

Langkah 1: Awali Visual Studio (atau Visual Studio Express). Buka projek dengan nama Demo Polimorfisme.

Langkah 2: Klik PROJECT pada batang menu Visual Studio dan kemudian seleksi Add Class…. Jendela Add New Item akan ditampilkan. Pastikan Class diseleksi sebagai tipe item. Ubah nama default menjadi Mahasiswa.cs dan klik tombol Add. Ini akan menambahkan file dengan nama Mahasiswa.cs pada projek.

Gambar 8.10 Form dari aplikasi Mahasiswa Ilmu Komputer

Langkah 3: File Mahasiswa.cs sekarang akan ditampilkan pada editor kode. Tambahkan katakunci abstract pada header kelas, seperti ditunjukkan pada baris 9 dari Program 8.10. Selanjutnya, sempurnakan kode untuk kelas Mahasiswa dengan mengetikkan baris 11-40 pada Program 8.10.

Program 8.10 Kode utuh untuk file Mahasiswa.cs pada aplikasi Mahasiswa Ilmu Komputer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Mahasiswa_Ilmu_Komputer
{
    abstract class Mahasiswa
    {
        //Bidang-bidang
        private string _nama;
        private string _id;

        //Konstruktor
        public Mahasiswa(string nama, string id)
        {
            _nama = nama;
            _id = id;
        }

        //Properti Nama
        public string Nama
        {
            get { return _nama; }
            set { _nama = value; }
        }

        //Properti ID
        public string ID
        {
            get { return _id; }
            set { _id = value; }
        }

        //Properti JamDiperlukan (abstrak)
        public abstract double JamDiperlukan
        {
            get;
        }
    }
}

Langkah 4: Klik PROJECT pada batang menu Visual Studio dan kemudian seleksi Add Class…. Jendela Add New Item akan ditampilkan. Pastikan Class diseleksi sebagai tipe item. Ubah nama default menjadi MahasiswaIlmuKomp.cs dan klik tombol Add. Ini akan menambahkan file dengan nama MahasiswaIlmuKomp.cs pada projek.

Langkah 5: File MahasiswaIlmuKomp.cs sekarang akan ditampilkan pada editor kode. Tambahkan notasi : Mahasiswa pada header kelas, seperti ditunjukkan pada baris 9 dari Program 8.11. Kemudian, sempurnakan kode untuk kelas MahasiswaIlmuKomp dengan mengetikkan baris 11-37 pada Program 8.11.

Perhatikan bahwa properti JamDiperlukan, pada baris 34-37, mendefinisikan ulang properti abstrak JamDiperlukan pada kelas basis. Properti ini menghitung dan menghasilkan jumlah jam yang diperlukan.

Program 8.11 Kode utuh untuk file MahasiswaIlmuKomp pada aplikasi Mahasiswa Ilmu Komputer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Mahasiswa_Ilmu_Komputer
{
    class MahasiswaIlmuKomp : Mahasiswa
    {
        //Konstanta-konstanta
        private double JAM_MATEK = 20;
        private double JAM_KOMP = 40;
        private double JAM_GEN = 60;

        //Bidang-bidang
        private string _jejakAkademik;

        //Konstruktor
        public MahasiswaIlmuKomp(string nama, string id, string jejak)
            : base(nama, id)
        {
            _jejakAkademik = jejak;
        }

        //Properti JejakAkademik
        public string JejakAkademik
        {
            get { return _jejakAkademik; }
            set { _jejakAkademik = value; }
        }

        //Properti JamDiperlukan
        public override double JamDiperlukan
        {
            get { return JAM_MATEK + JAM_KOMP + JAM_GEN; }
        }
    }
}

Langkah 6: Sekarang Anda akan menciptakan event handler Click untuk kontrol-kontrol Button. ganti view ke form Form1 pada Designer. Klik ganda pada kontrol tombolBaca. Ini akan membuka file Form1.cs pada editor kode, dan Anda akan melihat sebuah event handler kosong dengan nama tombolBaca_Click. Sempurnakan event handler dengan menuliskan kode yang ditunjukkan pada baris 22-45 pada Program 8.12. Amati kode ini:
Baris 23: Statemen ini mendeklarasikan tiga variabel string lokal: nama, id, dan jejak. Ketiganya akan dipakai untuk memuat masukan user.

Baris 26-27: Statemen-statemen ini membaca nama dan nomor ID yang dimasukkan oleh user dan menugaskan nilai-nilai itu kepada variabel nama dan id.

Baris 30-37: Statemen if-else ini menentukan tombol radio mana yang diseleksi dan menugaskan suatu nilai kepada variabel jejak.

Baris 40-41: Statemen ini menciptakan sebuah objek MahasiswaIlmuKomp, yang direferensi oleh variabel mhsIlKomp, dan menginisialisasinya dengan data yang dimasukkan oleh user.

Baris 44-45: Statemen ini membaca nilai dari properti JamDiperlukan dari objek mhsIlKomp dan menampilkannya pada kontrol labelJamDiperlukan.

Program 8.12 Kode utuh untuk Form1 pada aplikasi Mahasiswa Ilmu Komputer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Mahasiswa_Ilmu_Komputer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void tombolBaca_Click(object sender, EventArgs e)
        {
            //Variabel-variabel untuk memuat masukan
            string nama, id, jejak;

            //Membaca nama dan ID mahasiswa
            nama = teksNama.Text;
            id = teksNomorID.Text;

            //Membaca jejak akademik mahasiswa
            if (rbSistemInformasi.Checked)
            {
                jejak = "Sistem Informasi";
            }
            else
            {
                jejak = "Rekayasa Perangkat Lunak";
            }

            //Menciptakan sebuah objek MahasiswaIlmuKomp
            MahasiswaIlmuKomp mhsIlKomp =
                new MahasiswaIlmuKomp(nama, id, jejak);

            //Menampilkan jam yang diperlukan mahasiswa
            labelJamDiperlukan.Text =
                mhsIlKomp.JamDiperlukan.ToString("n1");
        }

        private void tombolKeluar_Click(object sender, EventArgs e)
        {
            //Menutup form
            this.Close();
        }
    }
}

Langkah 7: Tukar view kembali ke form Form1 pada Designer dan klik ganda pada kontrol tombolKeluar. Pada editor kode, Anda akan melihat sebuah event handler kosong dengan nama tombolKeluar_Click. Selesaikan event handler dengan menuliskan kode yang ditunjukkan pada baris 50-51 pada Program 8.12.

Langkah 8: Simpan projek dan jalankan aplikasi.



No comments:

Post a Comment