Как разрешить универсальному классу иметь себя в качестве типа и обязательного свойства [дубликат]C#

Место общения программистов C#
Ответить
Anonymous
 Как разрешить универсальному классу иметь себя в качестве типа и обязательного свойства [дубликат]

Сообщение Anonymous »

У меня есть общий класс для «общего» узла дерева следующим образом (упрощенно):

Код: Выделить всё

public class GeneralTreeNode
{
public virtual GeneralTreeNode? Parent { get; set; }
public virtual List Children { get; set; } = new List();
public virtual V Value { get; set; }

public GeneralTreeNode(V value, GeneralTreeNode? parent = null)
{
Value = value;
Parent = parent;
}

//public GeneralTreeNode() { Value = (V)this; }
// (not allowed: Cannot convert...)

public virtual GeneralTreeNode AddChild(V childValue)
{
var childNode = new GeneralTreeNode(childValue, this);
Children.Add(childNode);
return childNode;
}
}
Иногда я буду использовать этот класс как типичный контейнер: Node содержит содержимое узла или указывает на него через свойство Value. Это работает так, как и ожидалось.
Однако иногда мне также хочется использовать его там, где объект Content фактически наследует класс GeneralTreeNode, чтобы свойство Value указывало на него. Причина этого в том, что эти наследующие классы будут добавлять дополнительные указатели/ссылки на другие экземпляры того же класса, и им необходимо знать и иметь доступ к своим указателям и структуре GeneralTreeNode. (В отличие от типичного «содержащегося» класса, который не знает своего контейнера и внешней структуры).
Проблема в том, что я продолжаю получать ошибки, связанные с требованиями для установки/инициализации свойства Value. Вот простой пример:

Код: Выделить всё

// Example "integrated" use:
public class IntegratedValueNode : GeneralTreeNode
{
public int whatever { get; set; } = 0;

//public IntegratedValueNode() { Value = this; }
// (not allowed: No argument corresponds to the required formal parameter...)

//public IntegratedValueNode() : base(this) { }
// (not allowed: 'this' not available)
}
Приведенные выше комментарии к коду показывают различные вещи, которые я пытался решить, но ни одна из них не сработала, и без них он не будет компилироваться («Нет аргумента соответствует требуемому формальному параметру...»).
Я почти уверен, что раньше я мог это сделать (около 2010 года?) до того, как C# начал навязывать различные критерии «необнуляемых объектов», которые требуют, чтобы свойство было инициализировано базовым классом, прежде чем оно попадет в наследование конструктор класса.
Есть ли простой способ сделать это без необходимости обращаться к интерфейсу или делать свойство обнуляемым? Я не хочу делать значение обнуляемым, потому что оно никогда не является нулевым после инициализации, и я не хочу навязывать ложные проверки нуля для всего кода, который будет иметь к нему доступ. Я использую VS2022.

ПРИМЕЧАНИЕ. Предложение @shingo вызвать базовый конструктор с использованием null в качестве параметра сработало, но я не пробовал, потому что мне никогда не приходило в голову, что компилятор позволит использовать null в этот момент для параметра и свойства, не допускающего значения NULL.
Я (или Shingo, или кто-то еще, возможно) разместил бы это в качестве ответа, за исключением того, что мой вопрос был ошибочно помечен как дубликат предыдущего, практически не связанного с ним вопроса. Я рассмотрел этот вопрос, но, похоже, это не та же проблема, что и моя, в качестве решения он имеет то, что я уже пробовал, как указано в моем сообщении, и не дал никакого представления о том, как решить мою собственную проблему.
Похоже, что те, кто решил закрыть этот вопрос, никогда по-настоящему не читали/не понимали мой вопрос, на самом деле не знали, в чем заключалось решение, и на самом деле не читали/понимали вопрос и ответ, которые, как они утверждали, дублируются. Вместо этого, похоже, они просто предположили, что предыдущий вопрос с самым высоким рейтингом и тем же сообщением об ошибке был той же проблемой и тем же ответом.
Хотел бы я сказать, что это исключительный случай, но он был досадно распространенным с самого начала SO и со временем стал только хуже. И даже с моим относительно высоким рейтингом я мало что могу с этим поделать. Они скажут вам, что если вы отредактируете свой вопрос, он может открыться повторно, но это по большей части тщетная надежда. По моему опыту, менее 20% вопросов, которые следует открыть повторно, на самом деле открываются повторно. Когда я еще был активен, я сам много раз вел эту битву, отвечая на вопросы пользователей с низкой репутацией, пытающихся получить помощь. Но как я ни старался, мне едва удалось поднять шансы до 50% по любому отдельному вопросу.
И именно поэтому, когда я вышел на пенсию 5 лет назад, я перестал здесь участвовать. Я был здесь для того, чтобы попытаться помочь людям, а не для того, чтобы добровольно предложить свой профессиональный опыт коммерческой компании, или для того, чтобы подтвердить ОКР-чувства сообщества «редакторов», которые хотели «чистый» сайт, и, к сожалению, помощь людям является здесь приоритетом, который для меня слишком низок. Это по-прежнему лучший сайт для поиска ответов, но ужасный сайт для обращения за помощью.
Более 15 лет я вносил свой вклад, чтобы изменить это, но со временем ситуация только ухудшалась. Так что прочитайте это сейчас и согласитесь/не согласитесь по своему усмотрению. Но знайте, что, поскольку сеть SE также не терпит ни критики, ни разногласий, все это достаточно скоро будет удалено и удалено.

Подробнее здесь: https://stackoverflow.com/questions/798 ... d-property
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»