C # Неиспользуемые поля в базовых классах

#c# #field #base-class

#c# #поле #базовый класс

Вопрос:

В приложении prism у меня есть определение модуля, подобное этому:

 [Module(ModuleName = "TestModule", OnDemand = true)]
public class Test :
    ModelBase,
    IModule
{
  ...
  moduleName = "TestModule";
  ...
};
  

Как вы можете видеть, эти модули будут загружены во время выполнения, и многие из них имеют разные имена модулей.

Чтобы избежать избыточности кода, я написал базовый класс ModelBase, из которого эти модели выводятся следующим образом:

 public class ModelBase:
{
    /// <summary>
    /// The module name
    /// </summary>        
    protected string moduleName;
    ...
}
  

Строка moduleName никогда не используется в ModelBase, поэтому я получаю предупреждение компилятора CS0169, в котором говорится именно об этом.
Я не люблю подавлять предупреждения, поэтому мне интересно, есть ли лучшее решение.

moduleName будет задано с фактическим именем в производном классе, как вы можете видеть в 1-м фрагменте.

Проблема в том, что нельзя назначить имя в классе ModelBase, поскольку имя модуля здесь заранее неизвестно.

Эта проблема может показаться глупой, поскольку можно было бы написать

 public class ModelBase:
{
    /// <summary>
    /// The module name
    /// </summary>        
    protected string moduleName = "";
    ...
}
  

чтобы преодолеть эту проблему.

Интересно, существует ли «лучшая практика» для этого повторяющегося вопроса. Большое спасибо

Juergen

Комментарии:

1. Непубличные, непостоянные поля — это запах кода, IMO. Почему бы не использовать (возможно, абстрактное) свойство здесь?

Ответ №1:

Я бы лично сделал это абстрактным свойством:

 protected abstract string ModuleName { get; }
  

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

Аналогичной альтернативой было бы сделать это параметром конструктора вашего класса:

 protected ModelBase(string name)
{
    this.moduleName = name;
}
  

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

Ответ №2:

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

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

Ответ №3:

Что ж, вы можете рассмотреть возможность инициализации null имени модуля в конструкторе или как части определения переменной-члена, поскольку System.String это ссылочный тип.

Ответ №4:

Сделайте базу модели абстрактным классом, а затем определите имя модели как свойство abstract только для чтения, подобное этому…

 Protected abstract string modelname { get; }
  

Это гарантирует, что производные классы дают имя модели