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