如何在私有和受保护访问修饰符之间进行选择以封装基类和子类之间的成员?

2023-12-02

我正在尝试一个在我的内部函数中使用私有值的项目。过去我只使用公共参数,但我注意到当使用尽可能多的私有参数时,混淆效果会更好。

我的问题是关于家长/儿童课程。

在我的主类中,我定义了所有参数如下:

public class MyFatherClass
{
    private long id = -1;
    public long ID { get { return this.id; } set { this.id = value; } }    
    ...
}

因此,在所有内部函数中,我访问的是我的私有值,而不是公共值。

然后在我的子类中,我只需添加特定于子类的参数。

public class MyChildClass : MyFatherClass
{
    private long anotherParameter = -1;
    public long AnotherParameter { get { return this.anotherParameter; } set { this.anotherParameter = value; } }    
    ...
}

只是,我看到在我的家长班级中,我可以访问id and ID没有问题,但是从子类中我只能访问ID(as id是私人的)。

如果我理解正确的话,我需要更换所有private by protected在我父母的女儿身上,这样就能解决问题吗? 我不明白的是,即使我保留它,代码仍然可以工作。 为什么我设置的时候没有出现错误信息ID女儿班的价值,这句话this.id=value已执行,但如果它是私有的,我如何从我的子类访问它?

我现在正在犹豫,我可以添加一个吗?private id在每个孩子的班级中,或者我可以设置id在我的父类中受到保护?

感谢您的解释。

编辑,只需在混淆后添加我的反向代码的屏幕截图,这样您就可以理解如何混淆私有/公共方法/字段的差异

enter image description here


为什么我没有错误消息,当我在子类中设置ID值时,这句话this.id=value已执行,但如果它是私有的,我如何从我的子类访问它?

当您调用类上的公共方法时,该方法可以访问该类的私有成员:

public class Foo
{
    public void Bar()
    {
        Baz();
    }

    private void Baz()
    {
        // private method called by public method
    }
}   

var foo = new Foo();
foo.Bar();

这编译得很好。您的 setter 是相同的:它是公共的,因此可以从任何地方调用,即使它访问私有成员也是如此。

至于让你的领域(private long id = -1;) protected:是的,这意味着您可以在派生类中访问它。但你是否愿意是另一个问题。

您出于某种原因宣布了公共财产。也许您想在其 setter 或 getter 中进行一些验证。如果没有,如果您只是使用属性来访问私有字段,则可以放弃整个私有字段并使用自动实现的属性:

public long ID { get; set; } = -1;

然后,您可以从任何地方访问该属性,从其内部、从派生类以及从使用此类的代码。

也可以看看:

  • 字段和属性有什么区别?
  • C# 中的自动属性是什么?它们的用途是什么?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在私有和受保护访问修饰符之间进行选择以封装基类和子类之间的成员? 的相关文章

  • 如何在C++中生成非常大的随机数

    我想使用 C 生成 0 2 64 范围内的非常大的随机数 我已经使用了 rand 函数 但它没有生成非常大的数字 有人可以帮忙吗 使用c 11 使用标准c 11的随机库 http en cppreference com w cpp nume
  • 什么定义了类型的大小?

    ISO C 标准规定 sizeof char lt sizeof short lt sizeof int lt sizeof long 我在 BIT Linux mint 19 1 上使用 GCC 8 大小为long int is 8 我正
  • 更新 Azure Blob 上的 LastModified

    我正在移植代码以使用 C 中的 Azure 存储 SDK 传统上 我称其为更新修改文件的上次写入 修改时间 File SetLastWriteTimeUtc fileName lastWriteTimeUtc 要更新 blob 的上次修改时
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • Boost MPI 在监听列表时不会释放资源?

    这是一个后续问题如何释放 boost mpi request https stackoverflow com questions 44078901 how do i free a boostmpirequest 我在监听列表而不是单个项目时
  • Qt/c++ 随机字符串生成[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序 需要生成多个随机字符串 几乎就像一个由一定长度的 ASCII 字符组成的唯一 ID 这些字符混合有大写 小写 数字字符 有没有 Qt 库可以实现这一点 如果没有 在纯 C 中生成多个随机字
  • 如何通过 libwebsocket 发送异步数据?

    我正在将 Warmcat 的 libwebsocket C 库用于小型 Websocket 服务器 我已经启动并运行了这些示例 并且可以发送数据以响应从 websocket 接收数据 例如回显发送的反向字节 但是 我无法弄清楚如何在不使用
  • 我可以将 char 或 DateTime 设置为 null 吗?

    我可以将 null 设置为char数据类型 并且DateTime在 C 中 多谢你们 这是不可能的 它是一个值类型 使用 char myChar null DateTime myDate null 这相当于 Nullable
  • 预编译头和 Visual Studio

    有没有办法设置 Visual Studio 解决方案参数 以便它只创建预编译头而不构建整个解决方案 具体来说 它是一个巨大的 C 解决方案 本身有许多项目 谢谢 仅选择 pch 创建者源文件 通常是 stdafx cpp 然后编译该文件 C
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • 如何调试.NET Windows Service OnStart方法?

    我用 NET 编写的代码仅在作为 Windows 服务安装时才会失败 该故障甚至不允许服务启动 我不知道如何进入 OnStart 方法 如何 调试 Windows 服务应用程序 http msdn microsoft com en us l
  • 如何在 C++ 和 QML 应用程序中使用 qrc?

    我在 Windows7 上用 c qnd Qt Creator QML 编写了 Qt Quick Desktop 应用程序 现在 我必须部署它 并且我需要隐藏 qml 文件和图像 意味着 将它们放入资源等中 我读到有一个很好的方法可以使用
  • 列表到优先队列

    我有一个 C 大学编程项目 分为两个部分 在开始第二部分时应该使用priority queues hash tables and BST s 我 至少 在优先级队列方面遇到了麻烦 因为它迫使我自己重做第一部分中已经实现的许多代码 该项目是关
  • ASP.net WebForms - 在标记中使用 GetRouteUrl

    我一直在尝试弄清楚如何将路由功能与 ASP net 4 0 WebForms 一起使用 我将一条路线添加到我的路线集合中 void Application Start RegisterRoutes RouteTable Routes voi
  • 在特定线程上运行工作

    我想要一个特定的线程 任务队列并在该单独的线程中处理任务 应用程序将根据用户的使用情况创建任务并将其排队到任务队列中 然后单独的线程处理任务 即使队列为空 保持线程活动并使用它来处理排队任务也至关重要 我尝试过几种实现TaskSchedul
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • 使用任务的经典永无止境的线程循环?

    给出了一个非常常见的线程场景 宣言 private Thread thread private bool isRunning false Start thread new Thread gt NeverEndingProc thread S
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有
  • 创建进程默认浏览器

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 我想获取线程 id 因此 ShellExecute 无法获取线程 id 因此我开始使用

随机推荐

  • glmmLasso 错误和警告

    我正在尝试使用 glmmLasso 在广义线性混合模型中执行变量选择 但出现了一个我无法解决的错误和警告 数据集不平衡 一些参与者 PTNO 拥有比其他参与者更多的样本 无缺失数据 我的因变量是二进制的 所有其他变量 除了 ID 变量 PT
  • 如何从Google Play商店获取应用市场版本信息?

    如何从 Google Play 商店获取应用程序版本信息 以便在 Play 商店应用程序更新时提示用户强制 建议更新应用程序 即用户使用旧版本应用程序时 我已经经历过android 市场 api这不是官方方式 并且还需要授权登录来自谷歌的身
  • 类将数据成员存储在顺序内存中?

    这个问题的简短版本 指向类的第一个数据成员的指针是否会导致指向其所有数据成员的指针 讨论 我正在阅读一些示例代码 这很有趣 当一个特定的函数 在本例中是glUniformMatrix4fvOpenGL 中的 C 函数 将数组作为参数 这是使
  • Javascript 模式:条件事件处理程序

    给定例如某种类实例具有状态 例如 活动 非活动 该实例还附加了一个点击事件 例如一个链接 但事件处理程序根据实例的状态执行不同的操作 伪代码 IF instance state IS active AND link is clicked T
  • 在 iOS 上通过 FCM 使用丰富推送通知中的数据

    我的问题可能很糟糕 但我在任何地方都找不到任何答案 我迷路了 所以我想在 iOS 10 中显示带有漂亮图像的丰富通知 为此 我使用 FCM 和 UNNotificationServiceExtension 如果我理解正确的话 它应该获取数据
  • 无法共同创建对象/找不到绰号 |雅各布

    当创建一个ActiveXComponent使用 JACOB 我收到以下错误 com jacob com ComFailException Can t co create object at com jacob com Dispatch cr
  • MF SinkWriter 写入样本失败

    我正在尝试使用 MediaFoundation 将 ID3D11Texture2D 编码为 mp4 下面是我当前的代码 初始化接收器写入器 private int InitializeSinkWriter String outputFile
  • 关于Linux的二进制兼容性

    如果我在 Ubuntu 上得到一些由 GCC 4 8 构建的 C 代码 该代码没有 GUI 界面 仅调用标准 Linux 库 那么该二进制文件可以在 RHEL 5 6 上完美运行 并且可以与更旧的 GCC 一起完美运行吗 一般情况下是不能的
  • 返回包含文件的目录

    R 中是否有命令可以返回包含正在执行的代码的文件的完整目录路径 类似于 PHP 的命令 SERVER SCRIPT FILENAME 我可以想到三个答案 但没有一个答案可能让您完全满意 因为 R 执行模型与 PHP 不同 按顺序排列 a R
  • 您可以从 .Net Microsoft Graph API 获取 PR_TRANSPORT_MESSAGE_HEADERS 0x007D 吗?

    我们使用别名电子邮件地址来将收到的电子邮件与客户进行匹配 所有别名地址都会传送到一个主邮箱中 ToRecipients 中未列出别名地址 如果我在 OWA 中打开电子邮件并查看邮件详细信息 我可以在邮件标头的 收件人 属性中看到别名 我尝试
  • Postgresql 使用 like 选择数组重叠的位置

    是否可以确定是否ARRAY列包含来自另一个数组的重叠值LIKE clause The 运算符有效 但字符串必须完全匹配 q select from articles where keywords mortgage brokers Exact
  • 如何使用 Microsoft Graph API 更新 SharePoint 列表中的人员或组列的值?

    我的情况 我正在使用微软图形API 测试版 更新 SharePoint ListItems 但是 我无法更改 个人或组 列的值 该列具有 允许多项选择 属性 并接受个人和组 这是它作为 ListItem columnSet 的一部分的样子
  • Powershell 和 cmd 环境变量

    我使用批处理脚本来设置该 shell 的一些本地环境变量 当我从该命令提示符启动 PowerShell 时 我期望这些环境变量在 PowerShell 脚本中可用 但我不认为这种情况会发生 有人可以帮助我我所缺少的吗 这些环境变量应该存在于
  • facebook 的社交登录在 ASP.Net MVC 5 项目中不起作用

    我正在学习在我的示例网站中实现 facebook 社交日志的教程 以下是我所做的步骤 将我的本地主机应用程序指向 https 并允许在 VS 中使用假 SSL 在 Facebook 开发者网站上创建了一个 Web 应用程序 并记下密钥和 I
  • 父母和孩子之间的沟通

    新手问题 在 Unix 上 在具有父级和一些子级的程序中 家长如何提醒孩子有效率的做一些工作 或者孩子们如何等待父母信号开始做一些工作 EDIT 该程序尝试并行执行复杂的计算 我已经使用共享内存作为所有子项的公共工作区来更新结果和数据传输
  • 如何在条形图上制作垂直角? [复制]

    这个问题在这里已经有答案了 有没有一种简单的方法可以将圆角放置在 D3 垂直条形图中的条形顶部 我一直在使用 attr rx 3 这似乎会影响 Bar 的所有四个角 您无法指定要在 SVG 中圆化哪些角 rx将影响所有 4 个角 唯一的解决
  • 从 URL Google 地图获取经纬度

    我需要一种方法来找出谷歌地图中提供其链接的地点的纬度 经度 或者 如果可能的话 我可以在地图上绘制应用程序内的点 或者使用某种意图共享谷歌地图的纬度经度 以便我可以从应用程序内接收它 上述任何一种可能是直接或间接的吗 简而言之 我有一个谷歌
  • iPhone 中的多人游戏 - 概念、策略、设计? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想为 iphone 开发一款在线多人游戏 我开发了两个 iPhone 应用程序 但它们不是游戏 所以这是我的第一个游戏 所以基本上我对在线多人游戏如何在iPhone上运行一无所
  • 计算数组逗号分隔值

    我正在使用此函数来获取 WordPress 中的自定义元字段数组 my var get meta values keywords if empty my var meta counts array foreach my var as met
  • 如何在私有和受保护访问修饰符之间进行选择以封装基类和子类之间的成员?

    我正在尝试一个在我的内部函数中使用私有值的项目 过去我只使用公共参数 但我注意到当使用尽可能多的私有参数时 混淆效果会更好 我的问题是关于家长 儿童课程 在我的主类中 我定义了所有参数如下 public class MyFatherClas