F#中的保护虚拟方法


  • f#不支持protected方法的定义。在这里解释了为什么
  • f#用摘要类定义的abstract方法替换virtual方法(请参阅此处)。

我想知道是否有一种方法可以防止从派生类外部访问abstract方法。

像帕特里克·韦克(Patryk®Wiek)一样

从设计模式来看,我们知道我们应该偏爱继承。以我的经验,您可以通过继承可以做的一切,也可以使用构图来完成。例如,您始终可以用策略替换模板方法。

模板方法是一种典型的抽象方法,但是如果您用策略替换它,则可以(某种)将其隐藏在客户端:

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

Foo的外部客户端没有可以调用strategy,因此可以实现与受到成员保护的相同目标。

您可能会争辩说,Foo的原始创建者可以保留对strategy的参考,并且仍然能够调用它。的确如此,但是受保护的成员也不是完全完全隐藏的,因为您通常可以从相关的班级中得出,这使您可以调用受保护的成员。

另一点是,如果您将Foo的创建者与Foo的客户端分开,则客户端将无法使用strategy

相关内容

最新更新