Megosztás a következőn keresztül:


Öröklődés

Az öröklés az "is-a" kapcsolat vagy almodellezés modellezésére szolgál az objektumorientált programozásban.

Öröklési kapcsolatok megadása

Az öröklési kapcsolatokat a inherit kulcsszóval adhatja meg egy osztálydeklarációban. Az alapszintű szintaktikai forma az alábbi példában látható.

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

Egy osztály legfeljebb egy közvetlen alaposztálysal rendelkezhet. Ha nem ad meg alaposztályt a inherit kulcsszó használatával, az osztály implicit módon örökli a következőt System.Object: .

Öröklött tagok

Ha egy osztály egy másik osztálytól öröklődik, az alaposztály metódusai és tagjai úgy érhetők el a származtatott osztály felhasználói számára, mintha a származtatott osztály közvetlen tagjai lennének.

Az engedélyezett kötések és konstruktorparaméterek privátak egy osztályhoz, ezért nem érhetők el származtatott osztályokból.

A kulcsszó base származtatott osztályokban érhető el, és az alaposztálypéldányra hivatkozik. A rendszer az önazonosítóhoz hasonlóan használja.

Virtuális metódusok és felülbírálások

A virtuális metódusok (és tulajdonságok) az F#-ban némileg eltérően működnek más .NET-nyelvekhez képest. Új virtuális tag deklarálásához használja a kulcsszót abstract . Ezt függetlenül attól, hogy megadja-e a metódus alapértelmezett implementációját. Így egy alaposztályban lévő virtuális metódus teljes definíciója a következő mintát követi:

abstract member [method-name] : [type]

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

Egy származtatott osztályban ennek a virtuális módszernek a felülbírálása a következő mintát követi:

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

Ha kihagyja az alapértelmezett implementációt az alaposztályban, az alaposztály absztrakt osztálysá válik.

Az alábbi példakód bemutatja egy új virtuális metódus function1 deklarációját egy alaposztályban, és azt, hogyan lehet felülbírálni egy származtatott osztályban.

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

Konstruktorok és öröklés

Az alaposztály konstruktorát a származtatott osztályban kell meghívni. Az alaposztály-konstruktor argumentumai megjelennek a záradék argumentumlistájában inherit . A használt értékeket a származtatott osztálykonstruktornak megadott argumentumokból kell meghatározni.

Az alábbi kód egy alaposztályt és egy származtatott osztályt mutat be, ahol a származtatott osztály meghívja az alaposztály konstruktorát az öröklő záradékban:

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

Több konstruktor esetén a következő kód használható. A származtatott osztálykonstruktorok első sora a inherit záradék, a mezők pedig explicit mezőkként jelennek meg, amelyek a val kulcsszóval deklaráltak. További információ: Explicit mezők: A val kulcsszó.

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")

Az öröklés alternatívái

Azokban az esetekben, amikor egy típus kisebb módosítása szükséges, fontolja meg egy objektumkifejezés használatát az öröklés alternatívaként. Az alábbi példa egy objektumkifejezés használatát szemlélteti egy új származtatott típus létrehozásának alternatívaként:

open System

let object1 =
    { new Object() with
        override this.ToString() = "This overrides object.ToString()" }

printfn "%s" (object1.ToString())

Az objektumkifejezésekről további információt az Objektumkifejezések című témakörben talál.

Objektumhierarchia létrehozásakor fontolja meg, hogy öröklés helyett diszkriminált egyesítést használjon. A diszkriminált egyesítések a különböző objektumok eltérő viselkedését is modellezhetik, amelyek közös általános típust használnak. Az egyetlen diszkriminált unió gyakran szükségtelenné teszi számos olyan származtatott osztály szükségességét, amelyek egymás kisebb változatai. A diszkriminált szakszervezetekkel kapcsolatos információkért lásd a hátrányos megkülönböztetést tartalmazó szakszervezeteket.

Lásd még