F#从C#继承类访问受保护字段
我有一门C#课程,看起来是这样的:F#从C#继承类访问受保护字段,c#,f#,C#,F#,我有一门C#课程,看起来是这样的: class A { protected SomeClass Field; } class B: A {} public class C : B { public int SomeMethod() { SomeClass stub = this.Field; FSharpFunc<Unit, int> d = new d@11(stub); return d.Invoke(n
class A {
protected SomeClass Field;
}
class B: A {}
public class C : B
{
public int SomeMethod()
{
SomeClass stub = this.Field;
FSharpFunc<Unit, int> d = new d@11(stub);
return d.Invoke(null);
}
}
以及F#中的以下代码:
我想在其中访问受保护的字段字段
。我知道我可以通过简单的键入base.something
()从B类访问受保护的字段,但是当我键入base.Field
从A类访问受保护的字段时,我得到一个错误,即结构或类字段不能从该代码位置访问,因为字段
在A类(?).
我的问题是,是否有可能访问它?我找到了解决问题的方法。
这样的代码是不正确的:
type C() =
inherit B()
member this.SomeMethod() =
let d() = base.Field.SomeMagic(someParameter) //this.Field also fails
d()
但这样的代码可以正常工作:
type C() =
inherit B()
member this.SomeMethod() =
let stub = this.Field
let d() = stub.SomeMagic(someParameter)
d()
我找到了解决问题的办法。
这样的代码是不正确的:
type C() =
inherit B()
member this.SomeMethod() =
let d() = base.Field.SomeMagic(someParameter) //this.Field also fails
d()
但这样的代码可以正常工作:
type C() =
inherit B()
member this.SomeMethod() =
let stub = this.Field
let d() = stub.SomeMagic(someParameter)
d()
存根变通方法之所以有效,是因为您试图访问let绑定函数d
主体中的受保护字段。这些函数被移动到上下文之外,它们在上下文中定义并编译成FSharpFunc
type的子类型。也就是说,在编译的F#代码中可以得到类似的结果(简化图):
并且在classC
之外不再发生受保护的访问 存根变通方法之所以有效,是因为您试图访问let绑定函数体中的受保护字段d
。这些函数被移动到上下文之外,它们在上下文中定义并编译成FSharpFunc
type的子类型。也就是说,在编译的F#代码中可以得到类似的结果(简化图):
并且在classC
之外不再发生受保护的访问 可能的副本。看起来使用问题的第一部分可以解决问题。@Kote不,如果我在B类而不是A类中声明了字段,则解决方案是正确的。实际上,我根本无法重现您的问题。如果我使用您显示的确切代码(但使用有效的方法体),我得到的“base”值只能用于直接调用被重写成员的基本实现。如果我正确地编写了代码,如this.Field
而不是base.Field
,那么它可以正常工作。可能会重复。看起来使用问题的第一部分可以解决问题。@Kote不,如果我在B类而不是A类中声明了字段,则解决方案是正确的。实际上,我根本无法重现您的问题。如果我使用您显示的确切代码(但使用有效的方法体),我得到的“base”值只能用于直接调用被重写成员的基本实现。如果我正确地编写了代码,如this.Field
而不是base.Field
,它工作得很好。编辑以使方法的主体明确(并将downvote更改为upvote)。编辑以使方法的主体明确(并将downvote更改为upvote)。@MNie:当然,在我被你的例子骗了之后,我觉得有义务给你一个@曼妮:当然,我被你的例子骗了之后,觉得有义务给我一个