¿Utilidad de los métodos abstractos?

21/07/2005 - 19:29 por Benton | Informe spam
Hola grupo,

Como recién llegado a C#, me pregunto cual es la utilidad práctica de los
métodos abstractos. Entiendo que los métodos virtuales, al tener
implementación en la clase abstracta, pueden sobreescribirse (o no) en las
clases derivadas.

Pero los métodos abstractos, aunque son virtuales, no tienen implementación
en la clase abstracta, por lo que siempre deben sobreescribirse en las
clases derivadas. Es decir, esto es prácticamente lo mismo que crear un
método privado allí. ¿O existe alguna diferencia que se me escapa?

Saludos,

-Benton

Preguntas similare

Leer las respuestas

#1 Norberto Planchart
21/07/2005 - 20:16 | Informe spam
La utilidad es que obligas a la clase que hereden de la abstracta a que
tenga un método X

Ejemplo en la clase abstracta _servivo_ creas el método abstracto _comer_
Así cualquier clase que herede de _servivo_ tiene que implementar
Obligatoriamente el método _comer_ a menos que sea abstracta también en ese
caso se lo deja a su hija.

_Es como un contrato si quieres ser servivo tienes que saber comer :-)

Con código se ve mejor!!!

abstract public class servivo
{
public abstract void comer();
}
public class humano: servivo
{
override public void comer()
{//como comen los humanos
}
}
abstract public class mamifero: servivo
{
//public abstract override void comer(); es posible asi solo para que se
lea
}
public class perro:mamifero
{
override public void comer()
{//como comen los humanos
}
}
// Esto no compila oro no puede ser servivo si no implementa comer
// public class oro: servivo
// {
// public void adornar(){}
// }

Es como una interface

Léete este libro. : http://www.josanguapo.com/ te explica el que y el
porque ;-)
muy muy bueno
Norberto Planchart, MCSD.Net
Caracas - Venezuela
-Como no sabían que era imposible, lo hicieron.-


"Benton" wrote in message
news:
Hola grupo,

Como recién llegado a C#, me pregunto cual es la utilidad práctica de los
métodos abstractos. Entiendo que los métodos virtuales, al tener
implementación en la clase abstracta, pueden sobreescribirse (o no) en las
clases derivadas.

Pero los métodos abstractos, aunque son virtuales, no tienen
implementación en la clase abstracta, por lo que siempre deben
sobreescribirse en las clases derivadas. Es decir, esto es prácticamente
lo mismo que crear un método privado allí. ¿O existe alguna diferencia que
se me escapa?

Saludos,

-Benton

Respuesta Responder a este mensaje
#2 Octavio Hernandez
21/07/2005 - 22:37 | Informe spam
Benton,

Es decir, esto es prácticamente lo mismo que crear un método privado allí.



Esta oración no tiene sentido, la visibilidad (público/privado/etc.) no
tiene nada que ver con la virtualidad y el polimorfismo.

Además de lo que dice Norberto, la otra diferencia entre hacer un método
abstracto o no es que al hacer el método abstracto, la clase es también
abstracta y eso impedirá la creación de instancias de esa clase; sólo se
podrá crear instancias de sus clases derivadas. Por ejemplo, no tiene
sentido crear objetos de la clase 'Figura', sólo deben existir triángulos,
rectangulos, círculos, etc.

Slds - Octavio

"Benton" escribió en el mensaje
news:
Hola grupo,

Como recién llegado a C#, me pregunto cual es la utilidad práctica de los
métodos abstractos. Entiendo que los métodos virtuales, al tener
implementación en la clase abstracta, pueden sobreescribirse (o no) en las
clases derivadas.

Pero los métodos abstractos, aunque son virtuales, no tienen
implementación en la clase abstracta, por lo que siempre deben
sobreescribirse en las clases derivadas. Es decir, esto es prácticamente
lo mismo que crear un método privado allí. ¿O existe alguna diferencia que
se me escapa?

Saludos,

-Benton

Respuesta Responder a este mensaje
#3 Benton
21/07/2005 - 23:00 | Informe spam
Benton,

Es decir, esto es prácticamente lo mismo que crear un método privado
allí.



Esta oración no tiene sentido, la visibilidad (público/privado/etc.) no
tiene nada que ver con la virtualidad y el polimorfismo.



Entiendo lo que dices. Mi planteamiento iba más bien en otro sentido: si
siempre tengo que hacer la implementación en la clase derivada, y no
necesito que sea un método obligatorio, podría incluso evitar la declaración
abstract en la clase base y poner el código en un método privado de la clase
derivada.

Creo que, además de lo que tu apuntas, el punto clave aquí es el carácter
obligatorio de estos métodos.

Saludos,

-Benton
Respuesta Responder a este mensaje
#4 Angel J. Hernández M.
21/07/2005 - 23:20 | Informe spam
Las clases abstractas son útiles cuando utilizas patrones de desarrollo como
"Factory" (Fábrica de clases). A diferencia de las Interfaces, las clases
abstractas poseen el código a ser implementado o utilizado por las clases
derivadas. En las Interfaces, debes implementar el código. A continuación te
muestro un ejemplo:

internal abstract class Prueba {
protected virtual float Suma(float a, float b) {
return a + b;
}
}

internal class ImplementaPrueba: Prueba {
public ImplementaPrueba() {}

public float NuevaSuma(float a, float b) {
float res1 = base.Suma(a,b);
float res2 = a + b;
return res1 + res2;
}
}

Saludos,

Angel J. Hernández M.
MCP - MCAD - MCSD - MCDBA
http://groups.msn.com/desarrolladoresmiranda
http://www.consein.com


"Benton" wrote in message
news:
Hola grupo,

Como recién llegado a C#, me pregunto cual es la utilidad práctica de los
métodos abstractos. Entiendo que los métodos virtuales, al tener
implementación en la clase abstracta, pueden sobreescribirse (o no) en las
clases derivadas.

Pero los métodos abstractos, aunque son virtuales, no tienen
implementación en la clase abstracta, por lo que siempre deben
sobreescribirse en las clases derivadas. Es decir, esto es prácticamente
lo mismo que crear un método privado allí. ¿O existe alguna diferencia que
se me escapa?

Saludos,

-Benton

Respuesta Responder a este mensaje
#5 Benton
22/07/2005 - 18:22 | Informe spam
Es como una interface




Norberto,

Creo que ya voy entendiéndolo mejor. Hice una clase base abstracta y dos
clases derivadas (muy parecidas) que implementan de forma diferente un
método abstracto declarado en la clase base. Me dí cuenta de la utilidad de
estos métodos con el siguiente ejemplo:

Exportar exp; // Declaro un objeto de la clase base

if (condicion)
exp = new Facturas(); // Una de las clases derivadas
else
exp= new Depositos(); // la otra

exp.Procesar();

Pues bien, si no hubiera declarado como abstracto el método Procesar() en la
clase base, no podría haberlo llamado después del "if". Y al mismo tiempo
estoy forzado a implementarlo en cada una de las clases derivadas.

Saludos,

-Benton
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida