Bagikan melalui


Warisan

Warisan digunakan untuk memodelkan hubungan"is-a", atau subjenis, dalam pemrograman berorientasi objek.

Menentukan Hubungan Pewarisan

Anda menentukan hubungan pewarisan menggunakan kata kunci inherit dalam deklarasi kelas. Bentuk sintaks dasar ditunjukkan dalam contoh berikut.

type MyDerived(...) =
    inherit MyBase(...)

Kelas dapat memiliki paling banyak satu kelas dasar langsung. Jika Anda tidak menentukan kelas dasar menggunakan kata kunci inherit, 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 pengikatan let dan parameter konstruktor bersifat privat bagi 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 Pengambilalihan Virtual

Metode virtual (dan properti) bekerja agak berbeda dalam F# dibandingkan dengan bahasa .NET lainnya. Untuk mendeklarasikan anggota virtual baru, Anda menggunakan kata kunci abstract. 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 di kelas turunan, pengambilalihan metode virtual ini mengikuti pola ini:

override [self-identifier].[method-name] [argument-list] = [method-body]

Kelas dasar akan menjadi kelas abstrak jika Anda menghilangkan implementasi default di kelas dasar.

Contoh kode berikut mengilustrasikan deklarasi metode virtual baru function1 di kelas dasar dan cara mengambil alih 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 Pewarisan

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 pewarisan:

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

Jika ada beberapa konstruktor, kode berikut dapat digunakan. Baris pertama konstruktor kelas turunan adalah klausa inherit, dan bidang muncul sebagai bidang eksplisit yang dideklarasikan dengan kata kunci val. Untuk informasi selengkapnya, lihat Bidang Eksplisit: Kata Kunci val.

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 Pewarisan

Dalam kasus di mana modifikasi kecil jenis diperlukan, pertimbangkan untuk menggunakan ekspresi objek sebagai alternatif untuk pewarisan. 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 gabungan terdiskriminasi alih-alih pewarisan. Gabungan terdiskriminasi juga dapat memodelkan perilaku yang bervariasi dari berbagai objek yang berbagi jenis keseluruhan umum. Gabungan terdiskriminasi tunggal sering kali dapat menghilangkan kebutuhan akan sejumlah kelas turunan yang merupakan variasi kecil dari satu sama lain. Untuk informasi tentang gabungan terdiskriminasi, lihat Gabungan Terdiskriminasi.

Lihat juga