看来如果我在基类中声明一个抽象成员(以便派生类可以覆盖它),这个成员必须是公共的 .

但是,有些情况我不想将此类成员公开为公共方法 . 它仅适用于需要虚拟调度的内部实现 .

由于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” .

问题是“会员”变得“公开”,但它只是针对某些内部实施需求 . 由于没有“受保护”,我希望我可以使用“内部” . 但是,编译器也不允许这样做(这里有任何关于推理的想法吗?) . 如果不使用“抽象”成员,我怎么能做到类似的事情? (并且没有改变当前的继承链,它已经拥有大量的代码......)

非常感谢任何建议!