Sida 1 av 1

C# List<interface>

Postat: 21 mars 2014, 22:36:01
av nibl
jag har ett litet problem.
Jag har ett interface "Node" och 2 klasser som implementerar det "klass1" och "klass2" och vill ha dessa i en gemensam lista.

Kod: Markera allt

List<Node> tree = new List<Node>();

klass1 k1=new klass1();

tree.Add(k1);

Detta ger kompileringsfel (cannot convert from klass1 to Node)

om jag istället ändrar till

Kod: Markera allt

tree.Add((Node)k1);
Så får jag ett "invalidCastException"

Re: C# List<interface>

Postat: 21 mars 2014, 23:55:54
av Zeela
Om du verkligen har gjort det du skriver så ska det fungera.
Men jag tror vi behöver se all kod (eller ett minimalt exempel där du får felet) för att komma vidare.
Kompileringsfelen indikerar att din klass1 inte alls implementerar interfacet Node.

Re: C# List<interface>

Postat: 22 mars 2014, 08:36:18
av nibl
Interfacet

Kod: Markera allt

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;

namespace WindowsFormsApplication1
{
    interface Node : IXmlSerializable 
    {
        void setSize();
        Size getSize();
    }
}
Klasserna (samma kod i båda just nu)

Kod: Markera allt

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;

namespace WindowsFormsApplication1
{
    class GruppNode : Node
    {

        public void setSize()
        {

        }

        public Size getSize()
        {
            return new Size(0,0);
        }

        public void WriteXml(XmlWriter writer)
        {
        }

        public void ReadXml(XmlReader reader)
        {
        }

        public XmlSchema GetSchema()
        {
            return (null);
        }
        
    }
}
och koden i "huvudklassen"

Kod: Markera allt

            List<Node> nodes=new List<Node>();
            SymbolNode n = new SymbolNode();
            nodes.Add((Node)n);
            GruppNode gn = new GruppNode();
            nodes.Add((Node)gn);

Re: C# List<interface>

Postat: 22 mars 2014, 09:38:34
av papabear
Ser inget som inte borde funka.

Körde just igenom detta utan problem:

Kod: Markera allt

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            var nodes = new List<Node> {new SymbolNode(), new GruppNode()};

            foreach (var node in nodes)
            {
                Console.WriteLine(string.Format("Node is GruppNode: {0}", node is GruppNode));
                Console.WriteLine(string.Format("Node is SymbolNode: {0}", node is SymbolNode));
                Console.WriteLine();
            }

            Console.WriteLine("Press any key to continue.");
            Console.ReadKey();
        }
    }

    interface Node : IXmlSerializable
    {
        void setSize();
        Size getSize();
    }

    class GruppNode : Node
    {

        public void setSize()
        {

        }

        public Size getSize()
        {
            return new Size(0, 0);
        }

        public void WriteXml(XmlWriter writer)
        {
        }

        public void ReadXml(XmlReader reader)
        {
        }

        public XmlSchema GetSchema()
        {
            return (null);
        }

    }

    class SymbolNode : Node
    {

        public void setSize()
        {

        }

        public Size getSize()
        {
            return new Size(0, 0);
        }

        public void WriteXml(XmlWriter writer)
        {
        }

        public void ReadXml(XmlReader reader)
        {
        }

        public XmlSchema GetSchema()
        {
            return (null);
        }

    }
}

Re: C# List<interface>

Postat: 22 mars 2014, 16:59:33
av discomike
Jag ser heller inget som är fel, du behöver inte casta de till interfacet.

Kolla så du inte råkat importera nån annan Node än ditt interface, är ju rätt vanligt namn.

/MM