f# 中受保护的虚拟方法

2023-12-20

  • F# 不支持定义protected方法。这里解释一下why https://stackoverflow.com/questions/2390515/why-isnt-there-a-protected-access-modifier-in-f
  • F# 替换virtual方法与abstract抽象类中定义的方法(参见here http://msdn.microsoft.com/en-us/library/dd233225.aspx).

我想知道是否有办法阻止访问abstract根本没有来自派生类外部的方法。


和 Patryk Ćwiek 一样,我也不认为这是可能的,但这是另一种选择:

From 设计模式 http://amzn.to/XBYukB我们知道我们应该赞成组合而不是继承。根据我的经验,您可以用继承做的所有事情,也可以用组合来做。例如,您始终可以用策略替换模板方法。

模板方法是抽象方法的典型用法,但如果将其替换为策略,则可以(在某种程度上)对客户端隐藏它:

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, the strategy客户端将无法使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

f# 中受保护的虚拟方法 的相关文章

  • F# 和 MEF:导出函数

    因此 我试图在 F 控制台应用程序中运行这个简单的测试 open System Reflection open System ComponentModel Composition open System ComponentModel Com
  • 为什么无法在 F# 项目中添加子文件夹?

    在大多数 NET项目中 我可以使用文件夹来组织代码文件 在 C 中 我不能 但过滤器最终会扮演相同的角色 但是 在 Visual Studio 2010 中的 F 中 我不能 每个代码文件都直接显示在项目目录中 为什么这个功能不可用 组织包
  • 如果模板包含虚函数安全吗?

    模板的早期绑定和虚函数的后期绑定 那么 模板中包含虚函数安全吗 template
  • obj[] 和 string[] 作为参数

    我在用Microsoft FSharp Reflection FSharpValue MakeUnion这需要一个Reflection UnionCaseInfo and an obj 可以为空 作为参数 但是 我得到了Type misma
  • 基于函数签名的模式匹配

    在 F 中 您可以对函数签名进行模式匹配 我想用一个函数来装饰多个函数 该函数测量函数的执行情况并调用 statsd 我当前的功能是 let WrapFunctionWithPrefix metrics Metric Client IRec
  • F# 使用 while 循环

    我有一个数据读取器 我想从中返回行集合 在阅读了一天的书籍后 我无法找到在 f 中执行此操作的最佳方法 我可以在 F 中以正常的 C 方式进行操作 但这不是我使用 f 的原因 这就是我想要实现的目标 let values while rea
  • 如何让一条记录实现一个接口?

    如果我有一个界面 type IData abstract member firstName string abstract member lastName string 如何定义符合此接口的记录类型 我尝试了如下所示 gt type Dat
  • 如何为 Azure Function 启用“始终开启”功能?

    我有一个具有 3 个功能的功能应用程序 其中一个功能每 2 分钟定时器触发一次 我观察到 过了一会儿 该功能停止被触发 但当我进入门户时又重新启动 据我了解 原因是默认情况下 始终开启 处于关闭状态 但是 当我进入应用程序设置 常规设置时
  • 关于名称隐藏和虚函数的混淆

    参考另一个所以问题 https stackoverflow com questions 1628768 why does an overridden function in the derived class hide other over
  • 为什么 F# 的默认集合是排序的,而 C# 的不是?

    当从 C 世界迁移到 F 最惯用的可能 思维方式时 我发现了这个有趣的差异 在 C 的 OOP mutable 世界中 默认的集合集合似乎是HashSet https learn microsoft com en us dotnet api
  • 什么时候需要使用 new 来初始化 F# 类型?

    给定一个类 例如 type MyClass member this Greet x printfn Hello s x 使用初始化实例是否合适 let x new MyClass 或没有new 另外 什么时候使用new构造函数比 a 更有用
  • 在类型扩展中重载运算符

    好的 所以我基本上尝试将绑定运算符添加到选项类型中 似乎我尝试的所有内容都有一些不明显的警告阻止我这样做 我怀疑这与 NET 类型系统的限制有关 并且可能与类型类无法在用户代码中实现的原因相同 不管怎样 我已经尝试了一些事情 首先 我尝试了
  • 在 C++ 中定义虚拟 get 和 set 函数是否被认为是一个好习惯?

    如果我有一个简单的 2 级类层次结构 例如 level 1 class Spare Part private string name double price public Spare Part string getName return
  • 专家 f# 脚本编译奇怪

    第 209 210 页有一个扩展示例 见下文 我使用的是 F 4 5 总之 我不明白的是 如果我单独键入每个语句 则会有一个声明引发错误 如果我立即提交整个脚本 以及引发错误的声明之后的函数 则一切正常 那么 当我批量提交所有语句时 交互中
  • F# 内联如何工作?

    对于 F 我的理解是您可以使用 inline 关键字在调用站点执行类型专门化 那是 val inline a gt b gt c when a or b static member a b gt c 约束条件是 a or b必须有一个静态成
  • F# 中的递归对象?

    这段 F 代码 let rec reformat new EventHandler fun gt b TextChanged RemoveHandler reformat b gt ScrollParser rewrite contents
  • 指向虚拟成员函数的指针。它是如何工作的?

    考虑以下 C 代码 class A public virtual void f 0 int main void A f A f 如果我不得不猜测 我会说 A f 在这种情况下意味着 A 的 f 实现的地址 因为指向常规成员函数和虚拟成员函数
  • Java - 强制执行已实现的方法

    我有三门课 但我有问题 它们被命名为 GameScene StageScene StageOne 我的问题是我想在 StageScene 中实现初始化 但仍然强制 StageOne 实现它 这样每当有人使用 StageOne 对象 stag
  • 如何在 F# 中使用 LINQ 更新数据库中的表?

    我看过很多有关如何查询数据库的示例 但没有看到有关如何更新记录的示例 下面是我编写的用于检索表的简单代码 但有人可以解释一下如何修改字段 例如lastActiveDate 并更新数据库上的表 谢谢你 周日 open System open
  • 如何使用反射来确定 F# 联合类型是否是类似枚举的联合(每种情况下都没有字段)

    术语 在下面的文章中 我将使用术语 引用枚举 来指代 F 类型 该类型是在每种情况下都没有字段的可区分联合 例如 type AReferenceEnum Yes No Maybe 要求 我需要一个给定的函数Type 返回一个bool告诉类型

随机推荐

  • Oreo,默认短信应用程序和 ACTION_RESPOND_VIA_MESSAGE

    针对 Android O 的应用程序在使用服务时有一些新规则 其中之一是当应用程序处于后台时我们无法启动服务 成为默认 SMS 应用程序的要求之一是 来自 Telephony java javadoc li In a service inc
  • Firefox 对某些图像显示“无法加载图像”,并自动添加奇怪的类

    我已经尝试了很多次 也尝试了很多方法 但无法弄清楚这一点 下面的一组图像在非 Firefox 浏览器中可以完美加载 但所有这些图像在 Firefox 中都是不可见的 如果我打开文档检查器并将鼠标悬停在网址上 则只会弹出谷歌和电子邮件的图像
  • 如何在多线程应用程序中使用 Locale 来提高性能

    在我的应用程序中 我有一个由多个线程同时调用的方法 每个线程在运行时都会多次调用该方法 private Locale trLoc new Locale tr TR public double calculate String arg1 ar
  • Ruby 代码中的 C/C++?

    C C 是编写 Ruby 应用程序的一些性能关键方面的不错选择 我知道这是可能的 我想知道如何将C C 代码添加到Ruby代码中 与此相关的任何其他语言 您在开源项目或其他项目中是否注意到了这一点的任何实际应用 除了 Extending R
  • 未定义对“main”的引用

    你一定会喜欢链接器错误 讽刺 无论如何 我正在使用 pspsdk 附带的 allegro 的 psp 端口开发 psp 游戏 在我修复了所有其他未定义的引用之后 这个问题让我很困惑 完整的错误消息和 makefile 以及代码如下 错误详情
  • Windows 批处理脚本:捕获用户对“超时”命令的反应

    I know that by using the timeout command I can wait for specified amount of time but my question is that what if this wo
  • 尝试使用remote_api连接时出现“由于401而刷新”

    我正在尝试连接到基于 Google App Engine 的生产数据存储https cloud google com appengine docs python tools remoteapi enabling remote api acc
  • 从 Mvc 3 视图填充列表

    我有一个基于 Nominees 的 Viewmodel 我可以为视图模型指定多个提名者 我想从视图中填充 Ilist 这是我的视图模型 public class DebitViewModel IValidatableObject publi
  • 为什么与 PC 相比,Android 中的响应时间(对于休息呼叫)更慢?

    I am making a rest api call from Android device and was really surprised looking at the difference of speeds when compar
  • 以编程方式展开 segue

    我正在显示一个带有 UITableView 控件的 UIView 我通过调用 PerformSegueWithIdentifier 使用 Show Segue 显示此视图 在调用 segue 的模块中 我添加了一个要在展开时使用的函数 以便
  • Objective-c 中的自定义属性

    可以像在 VB NET 中一样在 Objective C 中创建自定义属性吗 例如 在 VB NET 中 您可以创建 Browsable 属性并在运行时读取它以确定是否应该显示属性 Public Class Employee
  • 关闭文件而不使用 using

    我有一个类 它从一个文件流读取数据并写入另一个文件流 我担心在 closeFiles 中处理完成后关闭流 您将如何处理一个流的处置可能引发异常以阻止调用另一流的处置的可能性 我应该关闭并在流中进行处理还是只处理一个 如果我从流处理中发现任何
  • 如何检测输入是否是引号?

    我有以下代码 if userInput do something 我希望它能够检测 userInput is a quote 但是 此代码会引发错误 如何检测是否输入is a quote 正如你所问的 如果输入contains引用 只是fi
  • Jssor 全宽滑块 - 连续循环/下一张/上一张图像部分可见

    有没有办法在滑块中部分显示上一张和下一张图像 IE 如果您有 3 张固定宽度的幻灯片 您可以部分看到其中一张的一部分 被不透明度和后退按钮覆盖 另一张幻灯片的整张 然后部分看到最 后一张 再次被不透明度和后退按钮覆盖 下一个按钮 然后您可以
  • usr/bin/env: 错误的解释器权限被拒绝 --> 如何更改 fstab

    我在 Windows 7 上使用 cygwin 运行激活 python 脚本的 bash 脚本 但出现以下错误 myscript script cydrive c users mydrive folder myscript py usr b
  • 如何从抽象类扩展枚举类?

    有这样的东西 public enum Token FOO foo f QUIT quit q UNKNOWN public parse String s for Token token values return token return
  • VHDL 中的行为模型程序和数据流模型程序之间的混淆

    我正在使用 Douglas L Perry 所著的教科书 VHDL 示例编程 第四版 他在第 4 页给出了 Dataflow 编程模型的示例 Code I ENTITY mux IS PORT a b c d IN BIT s0 s1 IN
  • 如何解决安卓验证错误?

    我正在工作 android 应用程序 当我运行该应用程序时出现以下错误 occred 请帮助我 01 20 20 39 02 955 WARN dalvikvm 5690 VFY arbitrarily rejecting large me
  • 输入框中占位符旁边的红色星号

    我已经做了很多谷歌搜索 但我找不到任何适合我的答案 我正在创建一个表单 有史以来第一次 并且我需要在输入框中的占位符文本旁边添加一个红色星号 尴尬的是 这是迄今为止我能得到的最接近的结果 form margin 0 auto backgro
  • f# 中受保护的虚拟方法

    F 不支持定义protected方法 这里解释一下why https stackoverflow com questions 2390515 why isnt there a protected access modifier in f F