Наследование в C #: статическое и нестатическое поле - PullRequest
1 голос
/ 12 октября 2011

У меня есть базовый класс библиотеки (Controller) и три подкласса, которые наследуются от Controller (Sensor, Output и Environment), где:

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 в классе Sensor или он все равно будет Controller.errorDescription?

EDIT

Ух ты, я только что понял, что все испортил. Вот как это должно быть, я думаю:

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, известен и исправлен (и требуется во всех производных классах), я должен сделать его статическим или просто оставить его защищенным, и каждый производный класс будет иметь свой собственный словарь (то есть этот. errorDescriptions)

Ответы [ 3 ]

1 голос
/ 12 октября 2011

Будет только одна статическая переменная, сколько бы у вас ни было подклассов. Это должно варьироваться в зависимости от подкласса, или это действительно одно глобальное отображение? Если это последнее, тогда уместна статическая переменная. Если нет ... ну, есть разные варианты, но вам нужно сообщить нам, для чего вы используете карту.

0 голосов
/ 12 октября 2011

Если вам нужен только один экземпляр словаря, чем да, измените его на защищенный статический. Также вы должны использовать ConcurrentDictionary вместо безопасности потока.

В производных классах вы получаете доступ к полю, используя Controller.errorDescription

0 голосов
/ 12 октября 2011

Ну, приватный член не будет виден вашим производным классам. Вам понадобится защищенный член или собственность для этого. Внутри класса вы можете просто ссылаться на него как errorDescription или this.errorDescription.

Я бы крайне опасался иметь статическую защищенную переменную-член, которая не является поточно-ориентированной и может быть изменена производными классами. Это просто напрашивается на неприятности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...