Home > OS >  Why is my method not being recognized by my generic object?
Why is my method not being recognized by my generic object?

Time:03-19

I've made a code that has an interface and an abstract class to make my main function to work with both objects. As I started to work around my function everything was working perfectly until I needed to get a function from the object itself. My function is:

void addNode<T>(List<T> genericList) where T : IGraphs{
                T genericNode = (T)Activator.CreateInstance(typeof(T));
                genericNode.Number = contDirected;
                
                if (genericList.Count > 0)
                {
                    string connectedNode = "";
                    while (!connectedNode.Equals("0") && genericList.RemainingNodesExist(undirectedGraphs, genericNode))
                    {
                  }      
                }
            }
        }

Obviously the function is not yet finished but the problem is on my last "while". As I try to get the method "RemainingNodesExist", the IDE gives me an advice saying that List does not have a definition for the method. Im not sure why is that since I have it on my classes:

    public interface IGraphs
{
    public int Number { get; set; }

    public List<int> LinkedNumbers { get; set; }

}

public abstract class AbstractGraphs<T>
{
    public abstract bool RemainingNodesExist(List<T> list, T node);
}

And on the classes that inherit from those above:

public class DirectedGraph: AbstractGraphs<DirectedGraph>, IGraphs
{
    public int Number { get; set; }
    public List<int> LinkedNumbers { get; set; }

    public DirectedGraph()
    {
        Number = Number;
        LinkedNumbers = new List<int>();
    }

    public override bool RemainingNodesExist(List<DirectedGraph> list, DirectedGraph node)
    {
        int numbersConnected = node.LinkedNumbers.Count;
        if (numbersConnected != list.Count)
        {
            return true;
        }
        return false;
    }
    public UndirectedGraph()
    {
        Number = Number;
        LinkedNumbers = new List<int>();
    }

    public int Number { get; set; }
    public List<int> LinkedNumbers { get; set; }

    public override bool RemainingNodesExist(List<UndirectedGraph> list, UndirectedGraph node)
    {
        int numbersConnected = node.LinkedNumbers.Count;
        if (numbersConnected != list.Count)
        {
            return true;
        }
        return false;
    }

To better summarize whats my goal... I have 2 objects that are exactly the same in properties, but the methods will probably be different in some situations. I used the generic class T because the program will use a list of objects not yet defined that can be any of the two objects mentioned above. What I want my program to do is run the "addNode" function and run the method of both objects based on their type.

Has anyone had to deal with a similar problem or could give me some direction on how to solve this?

CodePudding user response:

I am very suspicious of this code base, it looks way way too complicated.

But to answer your specific question

         while (!connectedNode.Equals("0") && genericList.RemainingNodesExist(undirectedGraphs, genericNode))

attempts to call a method on genericList, thats a List<XXX> passed as a parameter

That method (RemainingNodesExist) is defined here

public abstract class AbstractGraphs<T>
{
    public abstract bool RemainingNodesExist(List<T> list, T node);

}

Its a method of a class called AbstractGraphs<T>

Which has no relation to List<AnythinG>

Its hard to say what you need to change because this is such a convoluted set of classes.

Maybe if you can explain why you think that method would be callable on a list that might make it clearer

  • Related