公开受保护字段的最佳方式

2023-11-21

我有一个像这样的基类:

 public class BaseModalCommand
 {

    protected object m_commandArgument;
    protected int m_commandID;
    protected int m_enableUIFlags;

    public virtual void OnIdle()
    {
    }

    public virtual void OnResume()
    {
    }

    public virtual void OnStart(int commandID, object argument)
    {
    }

    public virtual void OnStop()
    {
    }



    public virtual int EnableUIFlags
    {
        get
        {
            return this.m_enableUIFlags;
        }
    }
}

虚拟方法将在派生类型中被重写。如果我通过 FxCop 运行它,它会抱怨没有声明可见实例字段,并建议将其更改为私有并将其公开为受保护的属性。

有什么想法吗?我认为这条消息可以忽略。


对于任何类,客户端代码都有两种用途:引用您的类的代码和继承您的类的代码。人们普遍认为第二种使用方式是迄今为止耦合最紧密的。班级的变化直接影响他们的内部机制。像这样公开受保护的成员意味着基类中的更改将以不可预测的方式影响派生类的工作方式,而无需比较每个基类和派生类的代码。同样糟糕的是,派生类可以修改基类的内部结构。

如果您确实想像这样公开内部数据成员,请将私有数据成员包装在受保护的属性中(如 gisresearch 建议的那样)。这些属性(以及任何受保护的方法)构成了继承接口你们班的。与向外部客户端公开的任何接口一样(无论是通过定义公共方法和属性,还是通过显式接口实现),您需要管理此接口,特别是在较大的代码库中。界面可以改变,但改变应该是一个有意识的决定。

如果直接使用受保护的数据成员,则对基类和派生类之间的依赖关系的控制就会少得多。相信我:甚至无法确定更改可能产生的影响可能是一件非常不愉快的事情。

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

公开受保护字段的最佳方式 的相关文章

  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • 静态只读字符串数组

    我在我的 Web 应用程序中使用静态只读字符串数组 基本上数组有错误代码 我将所有类似的错误代码保存在一个数组中并检查该数组 而不是检查不同常量字符串中的每个错误代码 like public static readonly string m
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • 使用 GCP 的数据存储区时如何区分代码是在模拟器中运行还是在 GKE 中运行

    按照中给出的说明进行操作后 我不确定是否遗漏了任何内容https cloud google com datastore docs tools datastore emulator https cloud google com datasto
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string

随机推荐

  • Android杀死进程[重复]

    这个问题在这里已经有答案了 如何通过一次单击杀死整个应用程序 finish 不起作用 它重定向到之前的活动 请指导我 public void onClick View arg0 TODO Auto generated method stub
  • 在 iframe 中创建可排序的 jQuery UI

    在页面上我有一个 iframe 在这个 iframe 中是我需要进行排序的项目的集合 所有 Javascript 都在父页面上运行 我可以访问 iframe 文档中的列表并使用上下文创建可排序 var ifrDoc iframe conte
  • 为什么 postgres 对相同的间隔值显示两种不同的格式?

    我正在帮忙做这件事question尝试更改间隔的格式 from 01 day 22 10 37 to 46 10 37 我给出了一个字符串操作的解决方案 但后来我发现 postgres 可以在两种不同的格式上显示相同的间隔 SELECT 2
  • 如何从 Javascript 启动两个或多个自定义 URL 协议

    我有一个旧的 html 页面 它创建一个脚本文件并使用以下命令执行它 fsoObject new ActiveXObject Scripting FileSystemObject wshObject new ActiveXObject WS
  • linux下C++中socket监听没有解除绑定

    我有一个监听某个端口的套接字 我将 SIGSTOP 信号发送到在端口上等待的线程 使用accept 并终止它 然后我关闭我等待的套接字的 fd 但对于我的项目的下一次运行 它不允许我再次监听该端口 我的程序是linux下的C 我应该怎么办
  • 使用 .prototype 和 __proto__ 创建子类

    我最近通过编写一些 gnome shell 扩展来学习 javascript 因此我对 Javascript 的理解是由我在 gnome shell javascript 源代码中观察到的示例塑造的 我有一种感觉 我对课程的理解是错误的 只
  • Gson TypeToken 是如何工作的?

    据我了解 在 Java 中 与 C 中的泛型相反 泛型是编译时功能 并通过类型擦除来删除 那么 Gson 的TypeToken真的有效吗 它如何获得对象的泛型类型 来自 JLS 4 6 强调我的 类型擦除是从类型 可能包括参数化类型和类型变
  • Select2 取消/阻止默认 select2:在特定条件下选择 (v.4.0.x)

    我需要向每个 select2 项目添加一个按钮并阻止默认事件 以便只有按钮被触发 我有以下代码 但正常onSelect事件仍然被触发 select on select2 select test2 function test2 e if e
  • 没有给出与所需的形式参数“选项”相对应的参数

    我正在 Net Core 中开发我的第一个应用程序 由于某种原因 我收到此构建错误 错误CS7036没有给出与 LakeViewContext LakeViewContext DbContextOptions LakeView所需的形式参数
  • SQL Server 奇怪的多列分组场景和 OR

    我有一个奇怪的分组场景 并且在找出 SQL 中分组的最佳方法时遇到了一些麻烦 假设我们有下面一张表 CREATE TABLE Item KeyId VARCHAR 1 NOT NULL Col1 INT NULL Col2 INT NULL
  • java.lang.OutOfMemoryError:位图大小超出 VM 预算 - Android

    我在 Android 上开发了一个使用大量图像的应用程序 该应用程序运行一次 填充屏幕上的信息 Layouts Listviews Textviews ImageViews等 用户读取信息 没有动画 没有特效或者任何可以填满记忆的东西 有时
  • TabBarItems 并设置它们的图像大小?

    我目前正在向我的每个选项卡栏项目添加图像 我喜欢的一张图像的尺寸比条形项目的面积大得多 当我在故事板中设置栏项目的图像并运行模拟器时 带有该图像的栏按钮覆盖整个屏幕 现在我认为有一些自动方法可以让图像为每个栏按钮调整大小 遗憾的是事实并非如
  • 如何从航路 3 直接升级到航路 5

    开发由许多客户在许多生产环境中部署的产品 它至少包含一个 Spring Boot 应用程序 我们使用 Flyway 进行数据库模式迁移 从 Spring Boot 1 5 x 升级到 2 0 x 使我们的 Flyway 版本从 3 x 升级
  • InflateException 与来自官方设计库的 FloatingActionButton

    我在使用官方的时候遇到了一个bugFloatingActionButton来自 Google 的支持设计库 这是我的 LogCat android view InflateException Binary XML file line 34
  • 如何加快 Gensim Word2vec 模型加载时间?

    我正在构建一个聊天机器人 因此需要使用 Word2Vec 对用户的输入进行矢量化 我正在使用 Google 提供的包含 300 万个单词的预训练模型 GoogleNews vectors male300 所以我使用 Gensim 加载模型
  • 在 CMake 中获取目标依赖的所有源文件

    使用 CMake 如何获取进入可执行目标的所有源文件的列表 包括该可执行文件所依赖的所有目标中的所有源 我们在代码库中有一个模式 其中构建系统根据源树中的文件名和路径生成初始化程序调用程序 因此 我需要可执行目标所依赖的所有源文件的完整路径
  • Android - 如何使用新的存储访问框架将文件复制到外部 SD 卡

    我正在我的应用程序中实现文件浏览器功能 我知道如何使用 ACTION OPEN DOCUMENT TREE 意图获得外部 SD 卡的持久权限 以及如何使用 DocumentFile 类创建文件夹和删除文件 文件夹 但是 我无法找到将文件复制
  • 编译 ng-bind-html 后 ng-click 不起作用

    我有一个指令 app directive dir function compile sce return restrict E link function scope element attr scope watch content fun
  • 如何删除Python中的标点符号?

    我有一个问题 前任 我有一句话 s AAA BBB CCC 所以 我这样做 import string table str maketrans string punctuation s w translate table for w in
  • 公开受保护字段的最佳方式

    我有一个像这样的基类 public class BaseModalCommand protected object m commandArgument protected int m commandID protected int m en