简体   繁体   English

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

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

I have a library base class ( Controller ) and three sub-classes that inherit from Controller ( Sensor , Output , and Environment ) where: 我有一个库基类( 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

My question is this: Should I make the errorDescriptions static? 我的问题是:我应该使errorDescriptions静态吗? These error descriptions will not change from controller to controller (ie static) but I wasn't sure what happens in the inherited classes. 这些错误描述不会在控制器之间更改(即静态),但我不确定继承的类中会发生什么。 Will I have to refer to them as Sensor.errorDescription in the Sensor class or will it still be Controller.errorDescription ? 我将不得不在Sensor类中将它们称为Sensor.errorDescription还是仍将是Controller.errorDescription

EDIT 编辑

Wow, I just realized I messed up big time. 哇,我只是意识到自己搞砸了很多时间。 Here's how it should be, I think: 我认为这应该是这样的:

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.
{
   ...
}

So if errorDescriptions defined in ControllerBasics is known and fixed (and required in all derived classes) should I make it static or should I just leave it protected and each derived class will have it's own dictionary (ie this.errorDescriptions)? 所以,如果errorDescriptions定义ControllerBasics是已知的和固定的(要求所有派生类),我应该让静态的,或者我应该只是把它保护,每个派生类都会有它自己的字典(即this.errorDescriptions)?

There would only be one static variable, however many subclasses you have. 只有一个静态变量,但是您有许多子类。 Is it meant to vary by subclass, or is it truly one global mapping? 它是要因子类而异,还是真正的一个全局映射? If it's the latter, then a static variable is appropriate. 如果是后者,则适合使用静态变量。 If not... well, there are various options, but you'd need to tell us what you're using the map for. 如果不是...很好,有多种选择,但是您需要告诉我们您使用地图的目的。

Well, a private member won't be visible to your derived classes. 好吧,您的派生类将看不到私有成员。 You would need a protected member or property for that. 为此,您需要一个受保护的成员或财产。 Within the class, you can just refer to it as errorDescriptions or this.errorDescriptions. 在类中,您可以仅将其称为errorDescriptions或this.errorDescriptions。

I'd be extremely wary of having a static, protected member variable that isn't thread safe and can be mutated by derived classes. 我会非常谨慎地拥有一个静态的,受保护的成员变量,该成员变量不是线程安全的,并且可以通过派生类进行更改。 That's just asking for trouble. 那只是自找麻烦。

If you only need one instance of the dictionary than yes, change it to protected static. 如果只需要一个字典实例,则将其更改为protected static。 Also you should use ConcurrentDictionary instead for thread safety. 同样,为了线程安全,应该使用ConcurrentDictionary代替。

In the derived classes you access the field using Controller.errorDescription 在派生类中,使用Controller.errorDescription访问该字段

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

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