В C # у меня есть навязчивая древовидная структура, которая выглядит следующим образом:
public abstract class Node
{
Container parent;
Node nextNode;
Node previousNode;
public abstract class Container : Node
{
Node firstChild;
Node lastChild;
}
}
Различные объекты, которые могут быть добавлены в дерево, наследуются от Node
или Container
в зависимости от того, могут ли они иметь детей или нет.
Делая Container
внутренним классом, это означает, что он может получить доступ к закрытым членам в Node
для управления списком потомков контейнера.
Это все хорошо. Но теперь я хочу сделать его универсальным, чтобы я мог повторно использовать его, сохраняя при этом безопасность типов - в основном, перемещая все функциональные возможности дерева в общий класс над Node, а другой - между Node и Container. Вот примерный план того, что я пытаюсь сделать:
public abstract class GenericNode<Node, Container>
where Node : GenericNode<Node, Container>
where Container : GenericNode<Node, Container>.GenericContainer
{
Container parent;
Node nextNode;
Node previousNode;
public abstract class GenericContainer : Node
{
Node firstChild;
Node lastChild;
}
}
Что, конечно, не работает, потому что вы не можете GenericContainer
наследовать от Node
(ошибка компилятора CS0689 ). Даже если я откажусь от требования внутреннего класса (скажем, с помощью internal
и просто буду осторожен в своей собственной библиотеке), я все равно не смогу найти дизайн, который не сталкивается с той же проблемой (и ошибкой).
(Я не думал, что должен был бы это сделать, но просто изложил это: Я не пытаюсь "исправить" ошибку компиляции , и при этом я не ищу простую реализацию дерева. это вопрос дизайна контейнера.)
И теперь я немного озадачен. У кого-нибудь есть идеи о том, как создать эту вещь?
Edit: Обязательно посмотрите этот ответ , который является еще одним ударом в дизайне, который пытается использовать методы расширения, чтобы избежать проблемы "внедрения" класса в иерархию наследования ( но, к сожалению, не полностью работает).