#c# #templates #generics
Вопрос:
Я знаю, что название немного сбивает с толку, но потерпите.
Мне нужно сделать следующее
class TemplateClasslt;Tgt; { T nextNode; T prevNode; } class Derived : TemplateClasslt;Derivedgt; { public int Name; }
потому что я хочу nextNode
и prevNode
автоматически быть типом производного класса (он же. Производные)
Но когда я добавляю некоторые методы, TemplateClass
я получаю ошибки.
class TemplateClasslt;Tgt; { public T nextNode; public T prevNode; Mode mode; public enum Mode { isHead = 0, isTail, isMember, isNull } public void init (T previous, T next) { prevNode = previous; nextNode = next; } public void init (T get, Mode getMode) { mode = getMode; if ((int)getMode == 0) { nextNode = get; prevNode = null; get.prevNode = this; } else if ((int)getMode == 1) { prevNode = get; nextNode = null; get.nextNode = this; } else { Console.WriteLine ("Used the wrong "init" method"); } } }
Я получаю ошибки get.prevNode = this;
и get.nextNode = this;
Ошибка заключается в следующем :
'T' does not contain a definition for 'prevNode' and no accessible extension method 'prevNode' accepting a first argument of type 'T' could be found (are you missing a using directive or an assembly reference?)`
Я знаю, что означает ошибка, я просто не знаю, как ее обойти.
Заранее спасибо.
Комментарии:
1.
class TemplateClasslt;Tgt; where T : TemplateClasslt;Tgt;
. Смотрите Любопытно Повторяющийся шаблон шаблона2. @canton7 Правильно, это сработало. Удалось скомпилировать, но на самом деле еще не использовался в запущенной программе. Нужен ваш совет, замечаете ли вы какие-либо лазейки в бесконечной рекурсии в этом методе? Я чувствую, что если шаблон состоит только из методов и полей без какого-либо экземпляра объекта, это должно быть нормально.
3. Не более, чем любой другой класс, у которого есть ссылка на другой экземпляр того же времени. Такие вещи постоянно происходят, например, с деревьями и связанными списками
4. @canton7 Хорошо, большое спасибо. У меня было некоторое время, чтобы поиграть с этим, и до сих пор это работает довольно хорошо. Просто огромная потенциальная ошибка в будущем для тех, кому будет поручено поддерживать мой код. 🙂
5. Вы действительно видите эту закономерность вокруг-это не так уж неожиданно!