Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Pewarisan digunakan untuk memodelkan hubungan "is-a", atau subtipe, dalam pemrograman berorientasi objek.
Menentukan Hubungan Warisan
Anda menentukan hubungan pewarisan dengan menggunakan inherit kata kunci dalam deklarasi kelas. Formulir sinonis dasar diperlihatkan dalam contoh berikut.
type MyDerived(...) =
inherit MyBase(...)
Kelas dapat memiliki paling banyak satu kelas dasar langsung. Jika Anda tidak menentukan kelas dasar dengan menggunakan inherit kata kunci, kelas secara implisit mewarisi dari System.Object.
Anggota yang Diwariskan
Jika kelas mewarisi dari kelas lain, metode dan anggota kelas dasar tersedia untuk pengguna kelas turunan seolah-olah mereka adalah anggota langsung dari kelas turunan.
Setiap membiarkan pengikatan dan parameter konstruktor bersifat privat ke kelas dan, oleh karena itu, tidak dapat diakses dari kelas turunan.
Kata kunci base tersedia di kelas turunan dan mengacu pada instans kelas dasar. Ini digunakan seperti pengidentifikasi mandiri.
Metode dan Penimpaan Virtual
Metode virtual (dan properti) bekerja agak berbeda dalam F# dibandingkan dengan bahasa .NET lainnya. Untuk mendeklarasikan anggota virtual baru, Anda menggunakan abstract kata kunci. Anda melakukan ini terlepas dari apakah Anda memberikan implementasi default untuk metode tersebut. Dengan demikian definisi lengkap dari metode virtual di kelas dasar mengikuti pola ini:
abstract member [method-name] : [type]
default [self-identifier].[method-name] [argument-list] = [method-body]
Dan dalam kelas turunan, penimpaan metode virtual ini mengikuti pola ini:
override [self-identifier].[method-name] [argument-list] = [method-body]
Jika Anda menghilangkan implementasi default di kelas dasar, kelas dasar menjadi kelas abstrak.
Contoh kode berikut mengilustrasikan deklarasi metode function1 virtual baru di kelas dasar dan cara mengambil alihnya di kelas turunan.
type MyClassBase1() =
let mutable z = 0
abstract member function1: int -> int
default u.function1(a: int) =
z <- z + a
z
type MyClassDerived1() =
inherit MyClassBase1()
override u.function1(a: int) = a + 1
Konstruktor dan Warisan
Konstruktor untuk kelas dasar harus dipanggil di kelas turunan. Argumen untuk konstruktor kelas dasar muncul dalam daftar argumen dalam klausa inherit. Nilai yang digunakan harus ditentukan dari argumen yang disediakan ke konstruktor kelas turunan.
Kode berikut menunjukkan kelas dasar dan kelas turunan, di mana kelas turunan memanggil konstruktor kelas dasar dalam klausa warisan:
type MyClassBase2(x: int) =
let mutable z = x * x
do
for i in 1..z do
printf "%d " i
type MyClassDerived2(y: int) =
inherit MyClassBase2(y * 2)
do
for i in 1..y do
printf "%d " i
Dalam kasus beberapa konstruktor, kode berikut dapat digunakan. Baris pertama dari konstruktor kelas turunan adalah inherit klausa, dan bidang muncul sebagai bidang eksplisit yang dideklarasikan dengan val kata kunci. Untuk informasi selengkapnya, lihat Bidang Eksplisit: Kata val Kunci.
type BaseClass =
val string1 : string
new (str) = { string1 = str }
new () = { string1 = "" }
type DerivedClass =
inherit BaseClass
val string2 : string
new (str1, str2) = { inherit BaseClass(str1); string2 = str2 }
new (str2) = { inherit BaseClass(); string2 = str2 }
let obj1 = DerivedClass("A", "B")
let obj2 = DerivedClass("A")
Alternatif untuk Inheritance
Dalam kasus di mana modifikasi kecil dari jenis diperlukan, pertimbangkan untuk menggunakan ekspresi objek sebagai alternatif untuk warisan. Contoh berikut mengilustrasikan penggunaan ekspresi objek sebagai alternatif untuk membuat jenis turunan baru:
open System
let object1 =
{ new Object() with
override this.ToString() = "This overrides object.ToString()" }
printfn "%s" (object1.ToString())
Untuk informasi selengkapnya tentang ekspresi objek, lihat Ekspresi Objek.
Saat Anda membuat hierarki objek, pertimbangkan untuk menggunakan penyatuan yang didiskriminasi alih-alih warisan. Serikat yang didiskriminasi juga dapat memodelkan perilaku yang bervariasi dari berbagai objek yang berbagi jenis keseluruhan yang umum. Satu serikat diskriminasi sering dapat menghilangkan kebutuhan akan sejumlah kelas turunan yang merupakan variasi kecil satu sama lain. Untuk informasi tentang serikat pekerja yang didiskriminasi, lihat Serikat Pekerja Diskriminasi.