- 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
。