Dasar-dasar Pewarisan (Visual Basic)
Pernyataan Inherits
ini digunakan untuk mendeklarasikan kelas baru, yang disebut kelas turunan, berdasarkan kelas yang ada, yang dikenal sebagai kelas dasar. Kelas turunan mewarisi, dan dapat memperluas, properti, metode, peristiwa, bidang, dan konstanta yang ditentukan dalam kelas dasar. Bagian berikut menjelaskan beberapa aturan untuk pewarisan, dan pengubah yang dapat Anda gunakan untuk mengubah cara kelas mewarisi atau diwarisi:
Secara default, semua kelas dapat diwariskan kecuali ditandai dengan kata kunci
NotInheritable
. Kelas dapat mewarisi dari kelas lain dalam proyek Anda atau dari kelas di rakitan lain yang direferensikan proyek Anda.Tidak seperti bahasa yang memungkinkan beberapa pewarisan, Visual Basic hanya memungkinkan pewarisan tunggal di kelas; artinya, kelas turunan hanya dapat memiliki satu kelas dasar. Meskipun beberapa pewarisan tidak diizinkan di kelas, kelas dapat mengimplementasikan beberapa antarmuka, yang dapat secara efektif mencapai akhir yang sama.
Untuk mencegah mengekspos item terbatas di kelas dasar, jenis akses kelas turunan harus sama dengan atau lebih ketat daripada kelas dasarnya. Misalnya, kelas
Public
tidak dapat mewarisi kelasFriend
atauPrivate
, dan kelasFriend
tidak dapat mewarisi kelasPrivate
.
Pengubah Warisan
Visual Basic memperkenalkan pernyataan dan pengubah tingkat kelas berikut untuk mendukung pewarisan:
Pernyataan
Inherits
— Menentukan kelas dasar.Pengubah
NotInheritable
— Mencegah pemrogram menggunakan kelas sebagai kelas dasar.Pengubah
MustInherit
— Menentukan bahwa kelas dimaksudkan untuk digunakan sebagai kelas dasar saja. Instans kelasMustInherit
tidak dapat dibuat secara langsung; hanya dapat dibuat sebagai instans kelas dasar dari kelas turunan. (Bahasa pemrograman lainnya, seperti C++ dan C#, gunakan istilah kelas abstrak untuk menggambarkan kelas seperti itu.)
Mengesampingkan Properti dan Metode di Kelas Turunan
Secara default, kelas turunan mewarisi properti dan metode dari kelas dasarnya. Jika properti atau metode yang diwariskan harus ber perilaku berbeda di kelas turunan, properti atau metode tersebut dapat ditimpa. Artinya, Anda dapat menentukan implementasi baru pada metode, properti atau peristiwa di kelas turunan. Pengubah berikut digunakan untuk mengontrol pengambil-alihan properti dan metode:
Overridable
— memungkinkan properti atau metode di kelas diambil alih di kelas turunan.Overrides
— Mengambil alih properti atau metodeOverridable
yang ditentukan di kelas dasar.NotOverridable
— Mencegah properti atau metode ditimpa di kelas warisan. Secara default, metodePublic
-nya adalahNotOverridable
.MustOverride
— Mengharuskan kelas turunan mengambil alih properti atau metode. Ketika kata kunciMustOverride
digunakan, definisi metode hanya terdiri dari pernyataanSub
,Function
, atauProperty
. Tidak ada pernyataan lain yang diizinkan, dan khususnya tidak ada pernyataanEnd Sub
atauEnd Function
. metodeMustOverride
harus dideklarasikan dalam kelasMustInherit
.
Misalkan Anda ingin menentukan kelas untuk menangani penggajian. Anda dapat menentukan kelas generik Payroll
yang berisi metode RunPayroll
yang menghitung penggajian untuk minggu biasa. Anda kemudian dapat menggunakan Payroll
sebagai kelas dasar untuk kelas BonusPayroll
yang lebih khusus, yang dapat digunakan saat mendistribusikan bonus karyawan.
Kelas BonusPayroll
dapat mewarisi, dan mengambil alih, metode PayEmployee
ditentukan dalam kelas dasar Payroll
.
Contoh berikut mendefinisikan kelas dasar, Payroll,
dan kelas turunan, BonusPayroll
, yang mengambil alih metode, PayEmployee
, yang diwariskan. Prosedur, RunPayroll
, membuat lalu meneruskan objek Payroll
dan objek BonusPayroll
ke fungsi, Pay
, yang menjalankan metode PayEmployee
kedua objek.
Const BonusRate As Decimal = 1.45D
Const PayRate As Decimal = 14.75D
Class Payroll
Overridable Function PayEmployee(
ByVal HoursWorked As Decimal,
ByVal PayRate As Decimal) As Decimal
PayEmployee = HoursWorked * PayRate
End Function
End Class
Class BonusPayroll
Inherits Payroll
Overrides Function PayEmployee(
ByVal HoursWorked As Decimal,
ByVal PayRate As Decimal) As Decimal
' The following code calls the original method in the base
' class, and then modifies the returned value.
PayEmployee = MyBase.PayEmployee(HoursWorked, PayRate) * BonusRate
End Function
End Class
Sub RunPayroll()
Dim PayrollItem As Payroll = New Payroll
Dim BonusPayrollItem As New BonusPayroll
Dim HoursWorked As Decimal = 40
MsgBox("Normal pay is: " &
PayrollItem.PayEmployee(HoursWorked, PayRate))
MsgBox("Pay with bonus is: " &
BonusPayrollItem.PayEmployee(HoursWorked, PayRate))
End Sub
Kata Kunci MyBase
Kata kunci MyBase
bertindak seperti variabel objek yang mengacu pada kelas dasar instans kelas saat ini. MyBase
umumnya digunakan untuk mengakses anggota kelas dasar yang ditimpa atau dibayangi di kelas turunan. Secara khusus, MyBase.New
digunakan untuk secara eksplisit memanggil konstruktor kelas dasar dari konstruktor kelas turunan.
Misalnya, Anda merancang kelas turunan yang mengambil alih metode yang diwarisi dari kelas dasar. Metode yang ditimpa dapat memanggil metode di kelas dasar dan memodifikasi nilai pengembalian seperti yang ditunjukkan dalam fragmen kode berikut:
Class DerivedClass
Inherits BaseClass
Public Overrides Function CalculateShipping(
ByVal Dist As Double,
ByVal Rate As Double) As Double
' Call the method in the base class and modify the return value.
Return MyBase.CalculateShipping(Dist, Rate) * 2
End Function
End Class
Daftar berikut ini menjelaskan batasan penggunaan MyBase
:
MyBase
mengacu pada kelas dasar langsung dan anggotanya yang diwariskan. Ini tidak dapat digunakan untuk mengakses anggotaPrivate
di kelas.MyBase
adalah kata kunci, bukan objek nyata.MyBase
tidak dapat ditetapkan ke variabel, diteruskan ke prosedur, atau digunakan dalam perbandinganIs
.Metode
MyBase
yang memenuhi syarat tidak harus didefinisikan dalam kelas dasar langsung; sebaliknya dapat didefinisikan dalam kelas dasar yang diwariskan secara tidak langsung. Agar referensi yang memenuhi syarat olehMyBase
untuk dikompilasi dengan benar, beberapa kelas dasar harus berisi metode yang cocok dengan nama dan jenis parameter yang muncul dalam panggilan.Anda tidak dapat menggunakan
MyBase
untuk memanggil metode kelas dasarMustOverride
.MyBase
tidak dapat digunakan untuk memenuhi syarat itu sendiri. Oleh karena itu, kode berikut bersifat tidak valid:MyBase.MyBase.BtnOK_Click()
MyBase
tidak dapat digunakan dalam modul.MyBase
tidak dapat digunakan untuk mengakses anggota kelas dasar yang ditandai seolah-olah kelas dasarFriend
berada di rakitan yang berbeda.
Untuk informasi selengkapnya dan contoh lainnya, lihat Cara: Mengakses Variabel yang Disembunyikan oleh Kelas Turunan.
Kata Kunci MyClass
Kata kunci MyClass
bertindak seperti variabel objek yang mengacu pada instans kelas saat ini yang awalnya diimplementasikan. MyClass
menyerupai Me
, tetapi setiap metode dan panggilan properti aktif MyClass
diperlakukan seolah-olah metode atau properti tidak dapat didampingi. Oleh karena itu, metode atau properti tidak terpengaruh oleh penimpaan di kelas turunan.
MyClass
adalah kata kunci, bukan objek nyata.MyClass
tidak dapat ditetapkan ke variabel, diteruskan ke prosedur, atau digunakan dalam perbandinganIs
.MyClass
mengacu pada kelas yang berisi dan anggotanya yang diwariskan.MyClass
dapat digunakan sebagai kualifikasi untuk anggotaShared
.MyClass
tidak dapat digunakan di dalam metodeShared
, tetapi dapat digunakan di dalam metode instans untuk mengakses anggota kelas bersama.MyClass
tidak dapat digunakan dalam modul standar.MyClass
dapat digunakan untuk memenuhi syarat metode yang didefinisikan dalam kelas dasar dan yang tidak memiliki implementasi metode yang disediakan di kelas tersebut. Referensi seperti itu memiliki arti yang sama denganMyBase.
Metode.
Contoh berikut membandingkan Me
dan MyClass
.
Class baseClass
Public Overridable Sub testMethod()
MsgBox("Base class string")
End Sub
Public Sub useMe()
' The following call uses the calling class's method, even if
' that method is an override.
Me.testMethod()
End Sub
Public Sub useMyClass()
' The following call uses this instance's method and not any
' override.
MyClass.testMethod()
End Sub
End Class
Class derivedClass : Inherits baseClass
Public Overrides Sub testMethod()
MsgBox("Derived class string")
End Sub
End Class
Class testClasses
Sub startHere()
Dim testObj As derivedClass = New derivedClass()
' The following call displays "Derived class string".
testObj.useMe()
' The following call displays "Base class string".
testObj.useMyClass()
End Sub
End Class
Meskipun derivedClass
menimpa testMethod
, kata kunci MyClass
di useMyClass
meniadakan efek penggantian, dan kompiler menyelesaikan panggilan ke versi kelas dasar testMethod
.