base
F#3.0では、メンバーへの呼び出しとメンバーに対するより厳密なチェックが追加されていますprotected
。protected static
派生クラスで使用されるヘルパーメソッドを持つC#の次の抽象クラスのようなものがあります。
public abstract class Processor {
public abstract void Process();
protected static void Helper(object arg) { }
}
F#では、これらのヘルパーメソッドの1つがファーストクラス関数として渡されます。
type DerivedProcessor() =
inherit Processor()
let init f =
f ()
override x.Process() =
init Processor.Helper
2.0では文句なしにコンパイルされますが、3.0ではエラーが発生します。
保護されたメンバーが呼び出されるか、「base」が使用されています。これは、メンバーがオブジェクトスコープから脱出する可能性があるため、メンバーの直接実装でのみ許可されます。
OK、準拠するのは簡単です。呼び出しを別の静的メンバーでラップするだけです。
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);
}
}
質問:
- より厳密なチェックが追加されたのはなぜですか?
- (および関連する)このような些細な回避策はどのようなひどい問題に対処しますか?
- これが奨励することになっているより良いデザインはありますか?