f#中的受保护虚拟方法

NoI*_*his 2 virtual f# protected abstract

  • F#不支持protected方法的定义.这里解释了为什么
  • F#用抽象类中定义的virtual方法替换方法abstract(参见此处).

我想知道是否有办法阻止abstract从派生类外部访问方法.

Mar*_*ann 5

像PatrykĆwiek一样,我也不认为这是可能的,但这里有一个替代方案:

Design Patterns我们知道我们应该支持Composition over Inheritance.根据我的经验,你可以用继承做的一切,你也可以用Composition.例如,您始终可以使用策略替换模板方法.

模板方法是抽象方法的典型用法,但如果将其替换为策略,则可以(从某种程度上)将其隐藏在客户端中:

type Foo(strategy : IBar) =
    member this.CreateStuff() =
        // 1. Do something concrete here
        // 2. Use strategy for something here
        // 3. Do something else concrete here
        // 4. Return a result
Run Code Online (Sandbox Code Playgroud)

没有外部客户端Foo可以调用strategy,以便实现与保护成员相同的目标.

您可能会争辩说,原始创建者Foo可以保留strategy对它的引用,并且仍然可以调用它.这是真的,但受保护的成员也不是真正完全隐藏,因为你经常可以从相关的类派生,这使你能够调用受保护的成员.

还有一点就是,如果你分开的创造者Foo从客户端Foo时,strategy将无法使用到客户端.