[C#] ¿falta una directiva de uso o una referencia de ensamblado?

Iniciado por Siuto, 26 Diciembre 2009, 19:43 PM

0 Miembros y 1 Visitante están viendo este tema.

Siuto

Estoy aprendiendo C# y se me presenta un problema que no se como se soluciona a ver si me pueden dar una mano...

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Project1
{
    class Padre
    {
       
    }

    class Hijo1 : Padre
    {
        public void Metodo();
    }

    class Hijo2 : Padre
    {
        public void Metodo();
    }

    class Hijo3 : Padre
    {
        public void Metodo();
    }

    class Coleccion : HashSet<Padre>
    {
        public Coleccion()
        {
            this.Add(new Hijo1());
            this.Add(new Hijo2());
            this.Add(new Hijo3());
        }

        public void Recorrer()
        {
            foreach (var hijo in this)
            {
                hijo.Metodo();
            }
        }
    }
}



Citar'Project1.Padre' no contiene una definición de 'Metodo' ni se encontró ningún método de extensión 'Metodo' que acepte un primer argumento de tipo 'Project1.Padre' (¿falta una directiva de uso o una referencia de ensamblado?)


¿Como soluciono este problema?

mayofunk

Hola, lo que te dice es que el metodo Metodo(), no existe o al menos el (el "pc") no es capaz de verlo o encontrarlo.


No tengo nada a mano para comprobar, pero probablemente si haces :

class Padre
    {
         // En esta clase Padre, definire el metodo "Metodo", que en verdad no hace mucho :P
         public void Metodo()
         {
          // defino un numero entero
          int numeroEntero;
         
          // hago una asignacion simple.
          numeroEntero=1;

         }
    }


se solucionará.

o bien si haces :

class Hijo1 : Padre
    {
        // en vez de :
        // public void Metodo();
        public void Metodo()
        {
           //Cualquier cosa, desde una asignacion simple como la de antes, a "nada" como ahora.
        }
        // Osea, va sin el ';' y abriendo esas llaves.
    }


y haces lo mismo con los otros hijos.

Como consejo revisa bien la definicion de metodos y luego te metes con la Herencia ;)

Suerte y ánimo !

Foxy Rider

simple : declaraste un método sin implementación (y encima lo usás al método) ... la solución que planteó mayofunk es una -> implementación mínima y default...
o usar interface más que class ... (de paso tenés herencia múltiple siendo interfaces, a diferencia de clases ...)...


Código (csharp) [Seleccionar]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Project1
{
    interface Padre
    {
void Metodo();
    }

    class Hijo1 : Padre
    {
public void Metodo()
{
Console.WriteLine("Padre : Implementacion de Hijo1");
}
    }

    class Hijo2 : Padre
    {
public void Metodo()
{
Console.WriteLine("Padre : Implementacion de Hijo2");
}
    }

    class Hijo3 : Padre
    {
public void Metodo()
{
Console.WriteLine("Padre : Implementacion de Hijo3");
}
    }

    class Coleccion : HashSet<Padre>
    {
        public Coleccion()
        {
            this.Add(new Hijo1());
            this.Add(new Hijo2());
            this.Add(new Hijo3());
        }

        public void Recorrer()
        {
            foreach (var hijo in this)
            {
                hijo.Metodo();
            }
        }
    }
}


además, todas esas clases comparten en común Metodo(), así que ... ¿por que no poner Padre como interface?  meterle Metodo ahí e implementarlo en las clases hijas (o, declarar padre como una clase, implementar un Metodo() básico y heredar, sin dar la obligación de implementarlo), algo así :

Código (csharp) [Seleccionar]

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Project1
{
    class Padre
    {
public virtual void Metodo()
{
Console.WriteLine("Padre: Implementacion default");
}
    }


    class Hijo1 : Padre
    {
    }

    class Hijo2 : Padre
    {
public override void Metodo()
{
Console.WriteLine("Padre : Implementacion de Hijo2");
}
    }

    class Hijo3 : Padre
    {
    }

    class Coleccion : HashSet<Padre>
    {
        public Coleccion()
        {
            this.Add(new Hijo1());
            this.Add(new Hijo2());
            this.Add(new Hijo3());
        }

        public void Recorrer()
        {
            foreach (var hijo in this)
            {
                hijo.Metodo();
            }
        }
    }
}


Pasate por estas referencias :
Interfaces -> http://msdn.microsoft.com/es-es/library/ms173156.aspx
virtual -> http://msdn.microsoft.com/es-es/library/9fkccyh4.aspx

override -> http://msdn.microsoft.com/es-es/library/ebca9ah3.aspx
new (como modificador) -> http://msdn.microsoft.com/es-es/library/435f1dw2.aspx

Cuando usar new y override -> http://msdn.microsoft.com/es-es/library/ms173153.aspx y http://kementeus.wordpress.com/2007/08/28/clases-y-herencia-en-c-new-virtual-y-override/

Saludos ~

Meta

En lo que hiciste aquí:

Código (csharp) [Seleccionar]
// defino un numero entero
          int numeroEntero;
         
          // hago una asignacion simple.
          numeroEntero=1;


También te funciona así:

Código (csharp) [Seleccionar]
int numeroEntero = 1;
Tutoriales Electrónica y PIC: http://electronica-pic.blogspot.com/

mayofunk

Claro quesi ! lo hice así para mostrar más lineas :P

Salu2.

Siuto

Bueno gracias por el info y links, mañana salgo de vacaciones asi que cuando vuelvo leo todo.