C# List<interface>

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
nibl
Inlägg: 149
Blev medlem: 23 november 2012, 13:19:33

C# List<interface>

Inlägg 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"
Zeela
Inlägg: 176
Blev medlem: 28 augusti 2008, 11:23:49
Ort: Åtvidaberg
Kontakt:

Re: C# List<interface>

Inlägg 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.
nibl
Inlägg: 149
Blev medlem: 23 november 2012, 13:19:33

Re: C# List<interface>

Inlägg 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);
Användarvisningsbild
papabear
Inlägg: 834
Blev medlem: 14 mars 2004, 03:27:12
Ort: Eskilstuna
Kontakt:

Re: C# List<interface>

Inlägg 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);
        }

    }
}
discomike
Inlägg: 445
Blev medlem: 22 juli 2007, 11:34:13
Ort: Göteborg

Re: C# List<interface>

Inlägg 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
Skriv svar