问题描述
我有一个库基类( Controller
)和三个继承自 Controller
的子类(传感器
,输出
和环境
)其中:
I have a library base class (Controller
) and three sub-classes that inherit from Controller
(Sensor
, Output
, and Environment
) where:
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.errorDescription
,否则它仍然是 Controller.errorDescription
?
My question is this: Should I make the errorDescriptions
static? These error descriptions will not change from controller to controller (i.e. 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
?
编辑
哇,我刚刚意识到我搞砸了很多时间。应该是这样的,我认为:
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.
{
...
}
所以如果<$在$ code> ControllerBasics 中定义的c $ c> errorDescriptions 是已知的并且是固定的(并且在所有派生类中都是必需的)我应该将它设为静态还是应该离开它受保护,每个派生类都有它自己的字典(即this.errorDescriptions)?
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 (i.e. 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.
这篇关于C#继承:静态与非静态字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!