F#記錄不能被繼承,但它們可以實現接口。例如,我想創建不同的控制器:不使用接口訪問F#記錄基本屬性
type ControllerType =
| Basic
| Advanced1
| Advanced1RAM
| Advanced1RAMBattery
| Advanced2
// base abstract class
type IController =
abstract member rom : byte[]
abstract member ``type`` : ControllerType
type BasicController =
{ rom : byte[]
``type`` : ControllerType }
interface IController with
member this.rom = this.rom
member this.``type`` = this.``type``
type AdvancedController1 =
{ ram : byte[]
rom : byte[]
``type`` : ControllerType }
interface IController with
member this.rom = this.rom
member this.``type`` = this.``type``
type AdvancedController2 =
{ romMode : byte
rom : byte[]
``type`` : ControllerType }
interface IController with
member this.rom = this.rom
member this.``type`` = this.``type``
let init ``type`` =
match ``type`` with
| Basic ->
{ rom = Array.zeroCreate 0
``type`` = Basic } :> IController
| Advanced1 | Advanced1RAM | Advanced1RAMBattery ->
{ ram = Array.zeroCreate 0
rom = Array.zeroCreate 0
``type`` = ``type`` } :> IController
| Advanced2 ->
{ romMode = 0xFFuy
rom = Array.zeroCreate 0
``type`` = ``type`` } :> IController
我有2個問題:
- 當我創建一個控制器記錄,我需要把它上溯造型到一個接口。有沒有更好的方法來編寫上面的
init
函數而沒有:> IController
每條記錄? - 我試過歧視的工會,但不知何故最終編寫interfance像這個例子。但接口是一個.NET的東西,我怎樣才能以功能的方式重寫這個例子,用組合而不是繼承?
使用函數是greate。我不需要訪問'ram','rom'和'romMode',但是我可以在哪裏存儲這些數據以使用後者? – MiP
您可以將它們存儲在您的函數可以訪問的閉包中。看看我的例子:看看我在'controlSomething'的實現中如何使用'ram'和'rom'?你甚至可以讓它們變化! (雖然我強烈建議不要) –
我忘了我正在使用F#,謝謝。 – MiP