似乎如果我在基类中声明一个抽象成员(以便派生类可以覆盖它),那么这个成员必须是公共的。
然而,在某些情况下我并不想将此类成员公开为公共方法。它仅适用于需要虚拟调度的内部实施。
由于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<_>
然后我可以使用&#34;会员&#34;在Base类型的其他地方。
问题是&#34;会员&#34;成为公共&#34;,但它仅适用于某些内部实施需求。由于没有&#34;受保护&#34;,我希望我可以使用&#34;内部&#34;。但是,编译器也不允许这样做(这里有任何关于推理的想法吗?)。如何在不使用&#34; abstract&#34;的情况下实现类似的功能。会员? (并且不改变当前的继承链,已经有大量的代码......)
非常感谢任何建议!