У меня есть простой базовый вопрос о C # и наследовании.
В приведенном ниже примере я показываю 2 способа установки обязательных свойств (CaptionDisplayText и Firstname):
public abstract class BaseClass
{
private string _firstName;
protected BaseClass(string captionDisplayText)
{
this.CaptionDisplayText = captionDisplayText;
this._firstName = this.GetFirstName();
}
protected string CaptionDisplayText { get; private set; }
protected abstract string GetFirstName();
}
public class DerivedClass : BaseClass
{
protected DerivedClass():base(String.Empty)
{
}
protected override string GetFirstName()
{
return String.Empty;
}
}
Подход 1, CaptionDisplayText, вводит свойство и устанавливает его в конструкторе, тогда как подход 2 вводит абстрактный метод, который переопределяется в классе Derived.
Я знаю, что подход 2 плох, если метод был виртуальным, а не абстрактным, но здесь он абстрактный, что означает, что он выполняется перед конструктором базового класса, и это будет хорошо.
У меня есть 10-15 свойств / полей, которые должны быть установлены моими производными классами, поэтому я думаю, какой подход будет более понятным, читаемым и тестируемым.
Я думаю, что подход 1 более тестируем, в то время как подход 2 гораздо более читабелен. Подход 2 также будет тестируемым, поскольку фиктивный объект все равно должен будет реализовывать абстрактные элементы.
Какой способ, по вашему мнению, лучше всего, и существует ли третий путь?
Большое спасибо,