Как я вижу, проблема в методе Parse (...). Не в самом методе, а в его существовании. У вас есть некоторые необработанные данные (строка x), которые необходимо преобразовать в структурированные данные (пары ключ-значение) перед использованием для построения объектов. Поэтому вам нужно как-то передать структурированные данные в базовые и дочерние конструкторы. Я вижу 3 подхода:
- Анализ данных в базовом классе и использование защищенного базового свойства для передачи их дочерним элементам.
- Анализировать данные перед вызовом конструктора.
- Разбор данных по месту использования.
1
Вы можете расширить ответ Mehrdad через дополнительное защищенное свойство, которое содержит проанализированные аргументы. Что-то вроде:
abstract class Base {
protected ParsedData ParsedData;
// ...
protected Base(string x) {
ParsedData = Parse(x);
CommonFields(); //initialize common fields using ParsedData
}
}
class Derived1 : Base {
public Derived1(string x) : base(x) {
DerivedFields(); //initialize specific fields using ParsedData
}
}
2
Или вы можете передать предварительно проанализированную строку в конструктор:
abstract class Base {
protected ParsedData ParsedData;
// ...
public static ParsedData Parse(string x)
{
//Parse x here...
}
protected Base(ParsedData data) {
CommonFields(data); //initialize common fields using data
}
}
class Derived1 : Base {
public Derived1(ParsedData data) : base(data) {
DerivedFields(data); //initialize specific fields using data
}
}
3
Или разобрать в месте использования:
abstract class Base {
// ...
protected Base(string x) {
var data = Parse(x);
CommonFields(data); //initialize common fields using data
}
}
class Derived1 : Base {
public Derived1(string x) : base(x) {
var data = Parse(x);
DerivedFields(data); //initialize specific fields using data
}
}