Вам нужно вызвать конструктор базового класса.Если вы пропустите вызов :base(...)
, будет вызван конструктор без параметров базового класса.Поскольку ваш базовый класс не имеет такого конструктора, вы получаете ошибку.
public FHXTreeNode(FHXTreeNode<T> parent, T data)
:base(parent, data)
{
}
Вызов параметризованного конструктора базового класса также делает инициализации поля устаревшими, поскольку они уже назначены в базовом классе.
В C # вы не можете наследовать конструкторы.Вы создаете новый конструктор в производном классе, который имеет ту же сигнатуру, что и конструктор базового класса.
Ваш интерфейс тоже поврежден: вы не можете объявить методы как public abstract
в интерфейсе,Методы интерфейса всегда неявно общедоступны и никогда не имеют реализации.Таким образом, эти модификаторы будут избыточными и недопустимыми.
Далее вы не можете override
методы интерфейса.Методы virtual
/ abstract
можно переопределять только из базового класса .Если у вас есть метод, который соответствует методу в интерфейсе, он реализует этот метод интерфейса.
Еще одна ошибка заключается в том, что вы повторно используете параметр типа в методах интерфейса: void AddChild<T>(T child);
неверно.Этот синтаксис предназначен для введения параметров типа в метод.Но вы хотите использовать параметр типа из содержащего типа.Поэтому вы должны написать AddChild(T child);
.
Также есть несколько стилистических проблем: Имена интерфейсов должны начинаться с префикса I
.И я бы по возможности избегал protected
полей.