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