共用方式為


繼承 (F#)

更新:2010 年 9 月

繼承用來在物件導向程式設計中建立 "is-a" 關聯性 (或稱子型別) 的模型。

指定繼承關聯性

您可以在類別宣告中使用關鍵字 inherit 來指定繼承關聯性。 基本語法形式如下列範例所示。

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

類別最多只能有一個直接基底類別。 如果您未使用關鍵字 inherit 指定基底類別,類別就會隱含繼承自 Object

繼承的成員

如果類別繼承自另一個類別,衍生類別的使用者就能使用此基底類別的方法和成員,就好像它們是衍生類別的直接成員一樣。

任何 let 繫結和建構函式參數都是類別私用的,因此不可從衍生類別存取它們。

關鍵字 base 可在衍生類別中使用,而且會參考基底類別執行個體。 其用法類似自我識別項。

虛擬方法和覆寫

相較於其他 .NET 語言,F# 中虛擬方法 (和屬性) 的運作方式稍有不同。 若要宣告新的虛擬方法,必須使用 abstract 關鍵字。 無論是否提供該方法的預設實作,都必須這樣做。 因此,在基底類別中虛擬方法的完整定義會遵循下列模式:

abstract member method-name : type

default self-identifier.method-nameargument-list = method-body

在衍生類別中,這個虛擬方法的覆寫會遵循下列模式:

override self-identifier.method-nameargument-list = method-body

如果省略基底類別中的預設實作,基底類別會成為抽象類別。

在下列程式碼範例中,會示範如何在基底類別中宣告新的虛擬方法 function1,以及如何在衍生類別中覆寫此方法。

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

建構函式和繼承

基底類別的建構函式必須在衍生類別中呼叫。 基底類別建構函式的引數會出現在 inherit 子句的引數清單中。 使用的值必須從提供給衍生類別建構函式的引數中判斷。

下列程式碼會示範基底類別和衍生類別,其中衍生類別會在 inherit 子句中呼叫基底類別建構函式:

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

在多個建構函式的情況下,可以使用下面的程式碼。 衍生類別建構函式的第一行是 inherit 子句,而欄位看起來像是以 val 關鍵字宣告的明確欄位。 如需詳細資訊,請參閱明確欄位: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")

繼承的替代方式

在型別需要稍做修改的情況下,可以考慮使用物件運算式做為繼承的替代方式。 下列範例說明如何使用物件運算式,做為建立新衍生型別的替代方式:

open System

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

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

如需物件運算式的詳細資訊,請參閱物件運算式 (F#)

當您建立物件階層時,請考慮使用已區分的聯集,而不要使用繼承。 對於共用一般整體型別之不同物件的各種行為,已區分的聯集也可以建立其模型。 使用單一已區分的聯集,通常就不需要多個彼此稍做變化的衍生類別。 如需已區分之聯集的詳細資訊,請參閱已區分的聯集 (F#)

請參閱

參考

物件運算式 (F#)

其他資源

F# 語言參考

變更記錄

日期

記錄

原因

2010 年 9 月

新增使用多個機底類別建構函式的資訊和程式碼範例。

資訊加強。