看来如果我在基类中声明一个抽象成员(以便派生类可以覆盖它),这个成员必须是公共的 .
但是,有些情况我不想将此类成员公开为公共方法 . 它仅适用于需要虚拟调度的内部实现 .
由于F#没有“受保护”,是否至少可以使其成为“内部”?
谢谢!
一些背景:
我正在现有的非小型F#代码库中做一些工作 . 它已经集中使用了继承(因此重构继承虽然可能是正确的,但目前还不可行) .
在特定情况下,有以下类型
type Base<'U> () =
// blah blah
type Derived1<'K, 'V when 'K equality> () =
inherit Base<'K * 'V>()
// Blah blah
type Derived2<'U> () =
inherit Base<'U>()
// Blah blah
现在我打算做一件事,如果我用抽象来做,那么可以利用虚拟调度,我将在Base中添加一个抽象成员
abstract member Member: unit -> Base<'U>
然后在Derived1中添加
override x.Member () =
y = // blah blah
y :> Base<_>
并在Derived2中添加
override x.Member () =
y = // blah blah
y :> Base<_>
然后我可以在Base类型的其他地方使用“Member” .
问题是“会员”变得“公开”,但它只是针对某些内部实施需求 . 由于没有“受保护”,我希望我可以使用“内部” . 但是,编译器也不允许这样做(这里有任何关于推理的想法吗?) . 如果不使用“抽象”成员,我怎么能做到类似的事情? (并且没有改变当前的继承链,它已经拥有大量的代码......)
非常感谢任何建议!