Как я могу создать объект в абстрактном классе, не имея знаний о реализации? - PullRequest
0 голосов
/ 11 мая 2010

Есть ли способ реализовать метод "CreateNode" в моем абстракте библиотеки ниже? Или это можно сделать только в клиентском коде вне библиотеки? В настоящее время я получаю сообщение об ошибке «Не удается создать экземпляр абстрактного класса или интерфейса« ToplogyLibrary.AbstractNode »

public abstract class AbstractTopology<T>
{
    // Properties
    public Dictionary<T, AbstractNode<T>> Nodes { get; private set; }
    public List<AbstractRelationship<T>> Relationships { get; private set; }

    // Constructors
    protected AbstractTopology()
    {
        Nodes = new Dictionary<T, AbstractNode<T>>();
    }

    // Methods
    public AbstractNode<T> CreateNode()
    {
        var node = new AbstractNode<T>();  // ** Does not work **
        Nodes.Add(node.Key, node);
        }
    }
 }

    public abstract class AbstractNode<T>
    {
        public T Key { get; set; }
    }

    public abstract class AbstractRelationship<T>
    {
        public AbstractNode<T> Parent { get; set; }
        public AbstractNode<T> Child { get; set; }

    }

Ответы [ 3 ]

3 голосов
/ 11 мая 2010

Вы не можете создать экземпляр абстрактного класса, поэтому вы получаете сообщение об ошибке.

Вместо этого вы можете объявить CreateNode как абстрактный метод и реализовать его в любых классах-потомках.

2 голосов
/ 11 мая 2010

Хорошо, какой конкретный класс узлов вы хотите создать ? Возможно, это что-то, что следует оставить до конкретного класса топологии? Если это так, вы можете сделать его абстрактным:

public abstract AbstractNode<T> CreateNode();

Затем предоставьте конкретную реализацию в классе конкретной топологии.

В качестве альтернативы, вы также можете сделать свой класс универсальным для типа узла:

public abstract class AbstractTopology<TValue, TNode>
    where TNode : AbstractNode<TValue>, new()

Тогда вы можете реализовать CreateNode следующим образом:

public AbstractNode<T> CreateNode()
{
    var node = new TNode();
    Nodes.Add(node.Key, node);
    return node;   
}

Лично я немного подозрительно отношусь к проектам, связанным с таким количеством абстрактных классов, но, возможно, у вас есть веские причины.

0 голосов
/ 11 мая 2010

определяет защищенный чистый абстрактный виртуальный метод, который CreateNode будет вызывать, чтобы подкласс возвращал новый объект

CreateNodeImpl или что-то.

...