F# 接口和属性
F# interfaces and properties
我正在尝试掌握 F#,在此过程中我正在转换一些 C# 代码。我在接口中定义属性并在类型中实现它们时遇到了一些麻烦。
考虑以下代码:
module File1
type IMyInterface =
abstract member MyProp : bool with get, set
abstract member MyMethod : unit -> unit
type MyType() =
interface IMyInterface with
member val MyProp = true with get, set
member self.MyMethod() = if MyProp then () else ()
The documentation for F# properties 似乎表明我在 MyType 中对 MyProp 的实现是正确的,但是,编译器抱怨 "The value or constructor 'MyProp' is not defined"。有什么想法吗?
这是一个工作版本:
type IMyInterface =
abstract member MyProp : bool with get, set
abstract member MyMethod : unit -> unit
type MyType() =
member val MyProp = true with get, set
member self.MyMethod() = if self.MyProp then () else ()
interface IMyInterface with
member self.MyProp with get () = self.MyProp and set v = self.MyProp <- v
member self.MyMethod() = self.MyMethod()
请注意,我包括了显式成员,因为您肯定会错过它们;)
要在(显式)接口中访问 属性,您需要转换为对接口类型的 self
引用:
type MyType() =
interface IMyInterface with
member val MyProp = true with get, set
member self.MyMethod() = if (self :> IMyInterface).MyProp then () else ()
如果显式实现接口,在 C# 中会出现相同的错误,并且还需要强制转换才能访问成员:
interface IMyInterface
{
bool MyProp { get; set; }
void MyMethod();
}
class MyType : IMyInterface
{
bool IMyInterface.MyProp { get; set; }
void IMyInterface.MyMethod()
{
if (((IMyInterface)this).MyProp) { }
}
}
如果您只是访问接口,那么您不需要在类型本身中定义成员。
如果你想要极简主义,菲尔的回答很好,但另一种方法
我喜欢的是使用 "let-bound" 值而不是成员——对于更复杂的代码,类型推断更好
而且他们一般比会员更容易打交道
type MyType() =
let mutable myProp = true
let myMethod() = if myProp then () else ()
interface IMyInterface with
member __.MyProp with get() = myProp and set v = myProp <- v
member __.MyMethod() = myMethod()
代码也比成员版本稍微干净一些,imo,因为 type MyType() as self
中的 self
标签
只需要访问 members -- let-bound 值可以直接从界面访问。
我正在尝试掌握 F#,在此过程中我正在转换一些 C# 代码。我在接口中定义属性并在类型中实现它们时遇到了一些麻烦。
考虑以下代码:
module File1
type IMyInterface =
abstract member MyProp : bool with get, set
abstract member MyMethod : unit -> unit
type MyType() =
interface IMyInterface with
member val MyProp = true with get, set
member self.MyMethod() = if MyProp then () else ()
The documentation for F# properties 似乎表明我在 MyType 中对 MyProp 的实现是正确的,但是,编译器抱怨 "The value or constructor 'MyProp' is not defined"。有什么想法吗?
这是一个工作版本:
type IMyInterface =
abstract member MyProp : bool with get, set
abstract member MyMethod : unit -> unit
type MyType() =
member val MyProp = true with get, set
member self.MyMethod() = if self.MyProp then () else ()
interface IMyInterface with
member self.MyProp with get () = self.MyProp and set v = self.MyProp <- v
member self.MyMethod() = self.MyMethod()
请注意,我包括了显式成员,因为您肯定会错过它们;)
要在(显式)接口中访问 属性,您需要转换为对接口类型的 self
引用:
type MyType() =
interface IMyInterface with
member val MyProp = true with get, set
member self.MyMethod() = if (self :> IMyInterface).MyProp then () else ()
如果显式实现接口,在 C# 中会出现相同的错误,并且还需要强制转换才能访问成员:
interface IMyInterface
{
bool MyProp { get; set; }
void MyMethod();
}
class MyType : IMyInterface
{
bool IMyInterface.MyProp { get; set; }
void IMyInterface.MyMethod()
{
if (((IMyInterface)this).MyProp) { }
}
}
如果您只是访问接口,那么您不需要在类型本身中定义成员。 如果你想要极简主义,菲尔的回答很好,但另一种方法 我喜欢的是使用 "let-bound" 值而不是成员——对于更复杂的代码,类型推断更好 而且他们一般比会员更容易打交道
type MyType() =
let mutable myProp = true
let myMethod() = if myProp then () else ()
interface IMyInterface with
member __.MyProp with get() = myProp and set v = myProp <- v
member __.MyMethod() = myMethod()
代码也比成员版本稍微干净一些,imo,因为 type MyType() as self
中的 self
标签
只需要访问 members -- let-bound 值可以直接从界面访问。