gpt4 book ai didi

inheritance - 了解 F# 3.0 中 protected /基本成员使用的更改

转载 作者:行者123 更新时间:2023-12-04 03:16:20 24 4
gpt4 key购买 nike

F# 3.0 对 base 的调用添加了更严格的检查。和 protected成员。我在 C# 中有类似下面的抽象类,它有 protected static派生类使用的辅助方法。

public abstract class Processor {
public abstract void Process();
protected static void Helper(object arg) { }
}

在 F# 中,其中一个辅助方法作为一等函数传递:

type DerivedProcessor() =
inherit Processor()

let init f =
f ()

override x.Process() =
init Processor.Helper

它在 2.0 中编译没有任何问题,但在 3.0 中会产生错误:

A protected member is called or 'base' is being used. This is only allowed in the direct implementation of members since they could escape their object scope.



好的,很容易遵守,只需将调用包装在另一个静态成员中

static member private HelperWrapper(arg) = Processor.Helper(arg)

并通过它。但为什么?

C# 对这种相同的模式没有问题。

public class HappyToCompile : Processor {
private void Init(Action<object> f) {
f(null);
}

public override void Process() {
Init(Helper);
}
}

问题:
  • 为什么要增加更严格的检查?
  • (和相关的)这样一个微不足道的解决方法解决了什么可怕的问题?
  • 这应该鼓励更好的设计吗?
  • 最佳答案

    使用我的通灵语言设计技能,我猜 F# 2.0 正在生成无法验证的代码。见 this发布在 Eric Lippert 的博客上,以解释 C# 中的相关问题(自 C# 4, IIRC 以来已修复)。

    简而言之,当您创建 F# 函数时,您实际上是在创建一个派生自 FSharpFunc<_,_> 的新类。 ,并且从该类中调用您的 protected 方法无效,因为它不在继承链中。

    当然,与其禁止这些调用,编译器可以只做你正在做的事情(创建一个私有(private)方法并使用它),但也许人们认为好处不会超过实现这种改进的成本。

    关于inheritance - 了解 F# 3.0 中 protected /基本成员使用的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12112377/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com