C # Неиспользуемые поля в базовых классах - PullRequest
3 голосов
/ 26 октября 2011

В приложении призмы у меня есть определение модуля как это:

[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 = "";
    ...
}

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

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

1024 * Юрген *

Ответы [ 4 ]

6 голосов
/ 26 октября 2011

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

protected abstract string ModuleName { get; }

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

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

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

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

2 голосов
/ 26 октября 2011

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

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

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

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

Protected abstract string modelname { get; }

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

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

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

...