【问题标题】:protected virtual methods in f#f# 中受保护的虚拟方法
【发布时间】:2014-04-08 21:43:00
【问题描述】:
  • F# 不支持protected 方法的定义。这里解释一下why
  • F# 将virtualmethods 替换为抽象类中定义的abstractmethods(请参阅here)。

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

【问题讨论】:

  • 我不认为这是可能的 - 你实际上是在问是否有办法制作方法 protected,这是不受支持的。 :) 也许您尝试解决的问题有不同的方法,尽管我们可能需要更多细节。
  • 好吧,我想这个问题说明了一切。但是,我认为这是一个值得提出的问题:可能存在一种创造性的解决方法。
  • internal 是否适合您的目的?

标签: f# virtual abstract protected


【解决方案1】:

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

Design Patterns 我们知道我们应该支持组合而不是继承。以我的经验,你可以用继承做的一切,你也可以用组合做。例如,您始终可以将 Template Method 替换为 Strategy。

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

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 对客户端将不可用。

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 2010-09-24
    • 2013-01-18
    • 1970-01-01
    相关资源
    最近更新 更多