繁体   English   中英

C#继承:静态与非静态字段

[英]C# Inheritance: Static vs. Non-Static Field

我有一个库基类( Controller )和三个继承自Controller子类( SensorOutputEnvironment ),其中:

public class Controller
{
   private SerialPort serial;
   private Sensor sensorSettings;
   private Output outputSettings;
   private Environment environmentSettings;       


   protected Dictionary<int, string> ErrorDescriptions
   { get{ this.errorDescriptions; } }

   protected SerialPort ControllerSerialPort
   { get{ this.serial; } }

   protected Sensor SensorSettings
   { get{ this.sensorSettings; } }

   // The other sub-class get properties.

   protected string SendReceive(string controllerCommand)
   { ... }

   ...
 }

 public class Sensor : Controller {...}
 ... // Other sub-classes

我的问题是:我应该使errorDescriptions静态吗? 这些错误描述不会在控制器之间更改(即静态),但我不确定继承的类中会发生什么。 我将不得不在Sensor类中将它们称为Sensor.errorDescription还是仍将是Controller.errorDescription

编辑

哇,我只是意识到自己搞砸了很多时间。 我认为这应该是这样的:

private abstract class ControllerBasics
{
   protected SerialPort serial;  // The serial port to communicate with the controller.
   protected Dictionary<int, string> errorDescriptions = new Dictionary<int, string> {...};   // Possible errors for the controller (known and fixed). Won't change from controller to controller.
   public enum Sensors {One, Two, ...};   // Possible sensor selection.

   public string SendReceiveCommand(string command){...} // Method to send string command over "serial".       
}

public class OverallController : ControllerBasics // The controller class.
{       
   // Add top-level controller settings.
   private string controllerName = "Controller1"; // Have a property to get/set.
   private bool controllerON; // Controller on/off. Have property to get/set.
   ... // Other similar fields and methods.

   // Used to "sort" the controller's many settings/functions.
   private SensorSettings sensorSettings;  // Have get/set properties for these so I could do the following: overallControllerInstance.GetSensorSettingsProperty.SetActiveSensorCount(5);
   private OutputSettings outputSettings;
   private EnvironmentSettings environmentSettings;

   public OverallController(string name, string comPort, ...)  // Constructor.
   {
      // Basic settings initialization.
      // Create serial port.
      this.sensorSettings = new SensorSettings(this.serial);
      this.outputSettings = ...
}

public class SensorSettings : ControllerBasics // Class to hold the controller's specific sensor settings and their respective get/set methods. Not a new type of controller.
{
   private int activeSensorCount; // Have public method to get/set.
   ... // Others.

  public void SetActiveSensorCount(int sensorCount)
  {
     // Send command using inherited SendReceive().
  }
  ... // Others.
}

public class OutputSettings : ControllerBasics   // Same logic as SensorSettings.
{
   private string units; // Have public method to get/set.
   ... // Others.

  public string GetUnitType()  // Meters, mm, um...
  {
     // Send command using inherited SendReceive().
  }
  ... // Others.
}

public class EnvironmentSettings : ControllerBasics   // Same logic as SensorSettings.
{
   ...
}

所以,如果errorDescriptions定义ControllerBasics是已知的和固定的(要求所有派生类),我应该让静态的,或者我应该只是把它保护,每个派生类都会有它自己的字典(即this.errorDescriptions)?

只有一个静态变量,但是您有许多子类。 它是要因子类而异,还是真正的一个全局映射? 如果是后者,则适合使用静态变量。 如果不是...很好,有多种选择,但是您需要告诉我们您使用地图的目的。

好吧,您的派生类将看不到私有成员。 为此,您需要一个受保护的成员或财产。 在类中,您可以仅将其称为errorDescriptions或this.errorDescriptions。

我会非常谨慎地拥有一个静态的,受保护的成员变量,该成员变量不是线程安全的,并且可以通过派生类进行更改。 那只是自找麻烦。

如果只需要一个字典实例,则将其更改为protected static。 同样,为了线程安全,应该使用ConcurrentDictionary代替。

在派生类中,使用Controller.errorDescription访问该字段

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM