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产生一个错误:
被保护的成员被称为或“基础”被使用。 这是只允许在直接执行的成员,因为他们无法逃脱它们的对象范围。
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);
}
}
问题:
- 为什么在严格的检查补充?
- (和相关的)可怕的问题做什么这样一个平凡的解决方法的地址?
- 有没有更好的设计,这是应该鼓励?