иерархия типов с параметрами типа? - PullRequest
2 голосов
/ 22 марта 2011

представьте себе этот макет классов, которые я использую для построения древовидной структуры:

class Treenodebase
{
    Treenodebase Parent{get;set;}
    IEnumerable<Treenodebase> Children {get;set;}
}
class Specialtreenode : Treenodebase
{
    string SpecialProperty{get;set;}
    public string ParentsSpecialProperty()
    {
        return Parent.SpecialProperty; //here I'd need casting?!
    }
}
class Othertreenode : Treenodebase
{
    string OtherProperty {get;set;}
}

Я использую подклассы для построения отдельных деревьев по всей моей программе. это означает, что у каждого Specialtreenode всегда есть только родитель типа Specialtreenode, а также потомки типа Specialtreenode.

Снято очень просто. Базовый класс имеет гораздо больше свойств (например, IsSelected и IsExpanded) и методов (например, «Предки» или «Братья и сестры» и т. П.), А также подклассы.

Могу ли я как-то использовать параметры типа здесь, чтобы избежать приведения в каждом из подклассов? Или это всегда подразумевает, что мои подклассы не наследуются от базового класса?

1 Ответ

3 голосов
/ 22 марта 2011

Вы можете сделать что-то вроде этого:

class Treenodebase<T> where T : Treenodebase<T>
{
    public T Parent{get;set;}
    public IEnumerable<T> Children {get;set;}
}
class Specialtreenode : Treenodebase<Specialtreenode>
{
    string SpecialProperty{get;set;}
    public string ParentsSpecialProperty()
    {
        return Parent.SpecialProperty;
    }
}

Конечно, это исключает неуниверсальный тип Treenodebase, который может быть хорошим или плохим. Если у вас есть много служебных методов, которым на самом деле все равно, какую реализацию вы используете, вы можете сделать Treenodebase<T> либо расширением неуниверсального базового класса, либо реализовать неуниверсальный интерфейс. С другой стороны, вам может быть проще сделать так, чтобы все ваши служебные методы также были типизированы. Это зависит от того, как вы используете дерево в коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...