F#抽象成员必须公开吗?

时间:2015-06-25 22:40:45

标签: f#

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

然而,在某些情况下我并不想将此类成员公开为公共方法。它仅适用于需要虚拟调度的内部实施。

由于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;的情况下实现类似的功能。会员? (并且不改变当前的继承链,已经有大量的代码......)

非常感谢任何建议!

0 个答案:

没有答案