【问题标题】:Access to protected member and properties case访问受保护的成员和属性案例
【发布时间】:2014-03-13 09:43:21
【问题描述】:

我有一个名为 Cocpit 的基类,用于服务器和协议派生类,然后我有 Heartbeatsupervisor 类,它将采用服务器和协议并做一些工作无论如何我在访问 Heartbeat 中的受保护成员时遇到了一些问题 - 我知道,因为我正在尝试通过服务器对象访问而不是通过心跳访问,但是如何根据我的整个代码解决该问题?

改变

public static bool IsConnectedToInternet()
        {

         Ping pingSender = new Ping();
        PingOptions options = new PingOptions();
        options.DontFragment = true;
        // Create a buffer of 32 bytes of data to be transmitted.
        string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        byte[] buffer = Encoding.ASCII.GetBytes(data);
        int timeout = 120;
        try
        {
          PingReply reply = pingSender.Send(HOST, timeout, buffer, options);
          if (reply.Status == IPStatus.Success)
          {            
            //Ping was successful
            return true
          }
          else 

【问题讨论】:

    标签: c# oop


    【解决方案1】:

    毕竟当想在 Heartbeat 中使用时,我无法在构造函数中访问 protocol.Name - 如何访问它?

    你不能,虽然它受到保护。 protected 旨在提供对FooFoo(和派生类)类型对象的受保护成员的访问权限。

    来自 C# 5 规范的第 3.5.3 节:

    如果在声明它的类的程序文本之外访问受保护的实例成员,并且在声明它的程序的程序文本之外访问受保护的内部实例成员时,必须进行访问在从声明它的类派生的类声明中。此外,访问需要通过派生类类型的实例或由它构造的类类型进行。此限制可防止一个派生类访问其他派生类的受保护成员,即使这些成员是从同一基类继承的。

    听起来您应该只将Name 设为公共财产。请注意,目前尚不清楚为什么这些都是虚拟的……有些也可以更简洁地实现为自动实现的属性。

    【讨论】:

    • Cocpit 将 Name 和 Id 提供给派生类 virtul,因为从一开始我不知道派生类是否需要进行一些计算,因此需要添加 setter 部署,如果他们可以使用它或自行实现需要在 setter 中做一些额外的值控制。我知道我不能这样做,但我正在寻找如何重建这个应用程序以使其工作的方法,因为 heartbeat 不在 Cocpit 的继承范围内,并且想要采用服务器和协议并进行一些计算,应该如何改变这一切来实现?跨度>
    • @nighttrain:您的意思不是很清楚,但您可以尝试将 getter 公开,但有一个受保护的 setter。跨度>
    • 我想要实现的是我的类 heartbeatsupervisor 将使用服务器和协议并将它们的值进行一些计算,比如说: Server sr = new Server("127.0.0.1");协议 pr = new Protocol("tcp");然后 Heartbeatsupervisor 将采用这两个并在某种方法中使用它们的值来进行 ping。
    • @nighttrain:所以(第三次)听起来你需要让Name 属性公开可读(还有Server.Ip)。
    • @nighttrain:不,我现在没有时间 - 但它真的简单。您拥有受保护的财产 - 使其成为公共财产。如果你想让 setter 受到保护,你可以这样做。请阅读msdn.microsoft.com/en-us/library/x9fsa0sw.aspx了解更多详情。
    猜你喜欢
    • 2013-08-06
    • 2012-11-27
    • 2017-08-01
    • 2016-10-01
    • 2015-01-30
    • 1970-01-01
    • 2023-03-23
    • 2014-06-07
    相关资源
    最近更新 更多