Bagikan melalui


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 kelas Friend atau Private, dan kelas Friend tidak dapat mewarisi kelas Private.

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 kelas MustInherit 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 metode Overridable yang ditentukan di kelas dasar.

  • NotOverridable — Mencegah properti atau metode ditimpa di kelas warisan. Secara default, metode Public-nya adalah NotOverridable.

  • MustOverride — Mengharuskan kelas turunan mengambil alih properti atau metode. Ketika kata kunci MustOverride digunakan, definisi metode hanya terdiri dari pernyataan Sub, Function, atau Property. Tidak ada pernyataan lain yang diizinkan, dan khususnya tidak ada pernyataan End Sub atau End Function. metode MustOverride harus dideklarasikan dalam kelas MustInherit.

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 anggota Private di kelas.

  • MyBase adalah kata kunci, bukan objek nyata. MyBase tidak dapat ditetapkan ke variabel, diteruskan ke prosedur, atau digunakan dalam perbandingan Is.

  • 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 oleh MyBase 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 dasar MustOverride.

  • 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 dasar Friend 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 perbandingan Is.

  • MyClass mengacu pada kelas yang berisi dan anggotanya yang diwariskan.

  • MyClass dapat digunakan sebagai kualifikasi untuk anggota Shared.

  • MyClass tidak dapat digunakan di dalam metode Shared, 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 dengan MyBase.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.

Lihat juga