Стандартная практика для обработки производных членов в производном классе - PullRequest
1 голос
/ 22 марта 2012

У меня есть базовый и производный класс, называемый Node, который формирует элементы Graph. Я хотел бы определить DerivedGraph, который может хранить только DerivedNodes и может иметь некоторые определенные методы DerivedNode. Узлы должны быть изменяемыми в обоих классах.

Какова стандартная практика борьбы с этим? Дублирование данных членов явно следует избегать. Должно ли это быть сделано проверкой типа и приведением в свойствах?

public class Node {}
public class DerivedNode : public Node {}

public class Graph 
{

    private List<Node> nodes;

    //some code
}

class DerivedGraph : Graph {}

EDIT:

Я должен добавить, что мне нужна функциональность, чтобы Graph мог содержать как узлы, так и DerivedNodes

Ответы [ 5 ]

2 голосов
/ 22 марта 2012

Я бы предложил использовать Generics для решения этой проблемы.

public class Node {}
public class DerivedNode : public Node {}

public class Graph<T> where T : Node
{

    private List<T> nodes;

    //some code
}

class DerivedGraph : Graph<DerivedNode> {}

Это позволит вам указать Node или DerivedNode при создании экземпляра класса.

0 голосов
/ 22 марта 2012

Используйте дженерики:

public class Node
{
}

public class DerivedNode : Node
{
}

public class Graph<T>
    where T : Node
{
    private List<T> nodes;

    //some code
}

public class DerivedGraph : Graph<DerivedNode>
{
}
0 голосов
/ 22 марта 2012

Вы можете генериков; что-то вроде

public class Graph<T> where T : Node 
{

    private List<T> nodes;

    //some code
}

class DerivedGraph : Graph<DerivedNode> {}
0 голосов
/ 22 марта 2012

Правильный способ сделать это - использовать общий класс Graph, а затем добавить ограничения к его типизированному параметру , чтобы убедиться, что он Node или является производным от Node:

public class Node {}
public class DerivedNode :  Node {}

public class Graph<T : Node>  // <<===
{
    private List<T> nodes;
    //some code
}

class DerivedGraph : Graph<DerivedNode> {}
0 голосов
/ 22 марта 2012

Может быть, сделать общий Graph и методы расширения для Graph, где T: DerivedNode?Примечание: только что пришло мне в голову, еще не сделали этого.Но это может сработать и сохранить ваш код в чистоте.

Вы можете просто сделать Graph универсальным и наследовать от Graph.Так что вам не придется беспокоиться о методах расширения

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