Посмотрите на следующий (псевдо) модель:Рекурсивный абстрактный ToString() в базовом классе?
public abstract class Animal {
public abstract AnimalType { get; }
public abstract override string ToString() {
return String.Format("{0}={1}", AnimalType, this.ToString());
^
// does this even work?
}
}
, который заставит каждый класс, производный от этого выглядеть следующим образом:
public sealed class Horse : Animal {
// horse specific declaration
private string _name;
private int _age;
// forced
public override AnimalType {
get { return AnimalType.Horse; }
}
// horse specific declaration
public Name {
get { return _name; }
public Horse(string name, string age) {
_name = name;
_age = age;
}
// forced
public override string ToString() {
return String.Format("{0}({1}", _name, _age);
}
}
, который будет производить следующий вывод:
Horse =MyHorseName(3);
Tiger =SomeOtherAttributesBecauseTigerIsDifferent
Проблема: когда я хочу f orce ToString() в производном классе, я не могу иметь никаких функциональных возможностей в базовом классе. Я хочу, чтобы производный класс предоставлял собственное строковое представление самого себя, но все же хочу иметь строковое представление, которое говорит мне, в этом случае, какое это животное.
Что именно вы хотите достичь? –
'public abstract override string ToString()' ????????????? OMG, это превосходит все мои ожидания :-) –
Можете ли вы объяснить, почему вы хотите заставить переопределить и обеспечить (переопределить) базовую функциональность? (Из того, что я понимаю, ваше решение может быть тем, что вы хотите уже, имея часть данных в базе/обычно отформатированную и часть в подклассах.) –