Estoy aprendiendo C# y se me presenta un problema que no se como se soluciona a ver si me pueden dar una mano...
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?
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 !
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 ...)...
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í :
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 ~
En lo que hiciste aquí:
// defino un numero entero
int numeroEntero;
// hago una asignacion simple.
numeroEntero=1;
También te funciona así:
int numeroEntero = 1;
Claro quesi ! lo hice así para mostrar más lineas :P
Salu2.
Bueno gracias por el info y links, mañana salgo de vacaciones asi que cuando vuelvo leo todo.