PDA

Ver la Versión Completa : Metodos abstractos


nikotina
15-08-2007, 14:41:33
Hola a todos. Estoy haciendo mis primeras armas en Java y en lo que es la POO. Mi pregunta concreta es sobre los metodos abstractos. No veo la diferencia entre usar un metodo abstracto (definido en una clase abstracta) para un cierto numero de clases (que extienden a la clase abstracta) y que cada clase lo implemente de forma diferente, a que cada clase tenga su propio metodo, ya que estos se implementan de forma diferente en cada clase.

espero haberme explicado bien

dec
15-08-2007, 16:38:52
Hola,

Suponiendo que en Java sea igual que en Delphi, hasta donde yo llego un método "abstracto" en cierta clase está obligando a las clases descendientes a implementar dicho método. De otro modo (en el caso de Delphi) obtendrías un "warning" al tratar de compilar tal que así:


[DCC Warning] Unit1.pas(31): W1020 Constructing instance of 'TMyChildClass' containing abstract method 'TMyClass.ShowMyName'


Es decir:


unit Unit2;

interface

type
TMyClass = class(TObject)
public
function ShowMyName(): string; virtual; abstract;
end;

type
TMyChildClass = class(TMyClass)
end;

implementation

end.


Al derivar la clase "TMyChildClass" de "TMyClass" estamos obligados a implementar en "TMyChildClass" el método "abstracto" "ShowMyName()". De no hacerlo así, la advertencia de antes, en tiempo de diseño, y, en tiempo de ejecución, una excepción "EAbstractError" si tratamos de ejecutar el método en cuestión.

De tal modo que tendríamos que hacer algo así:


unit Unit2;

interface

type
TMyClass = class(TObject)
public
function ShowMyName(): string; virtual; abstract;
end;

type
TMyChildClass = class(TMyClass)
public
function ShowMyName(): string; override;
end;

implementation

{ TMyChildClass }

function TMyChildClass.ShowMyName(): string;
begin
result := ClassName;
end;

end.


Ya digo. Puede que vaya más allá, pero, hasta donde llego, sirve para obligar a las clases descendientes a implementar determinados métodos. Acaso algún otro compañero pueda corregirme o en todo caso proporcionar algo más de información al respecto.

nikotina
15-08-2007, 17:06:17
Gracias Dec x contestar.

Creo que entendi cual es el objetivo de la abstraccion. Todavia no me cierra bien el tema de obligar a las clases derivadas a implementar metodos cuando cada clase puede implementar sus propios metodos. Pero puede ser que en ciertas ocaciones pueda ser util.

dec
15-08-2007, 17:09:46
Hola,

Bueno. La verdad es que yo tampoco estoy muy puesto en estos temas, todo hay que decirlo. Sin embargo, el que puedas obligar a una clase a implementar determinados métodos... supongo que tiene su utilidad. Tal vez en algún caso incluso se haga necesario, pero, yo me quedo por el momento conque puedes hacerlo. Ojo, no que tengas que hacerlo, sino que puedes hacerlo. :)

droguerman
15-08-2007, 17:56:23
puedes hacer esto y nadie te obliga a no hacerlo:

public class Trabajador
{
public Trabajador() {}
public void Trabajar() {}
}

public class TrabajadorPersona extends Trabajador
{
public void Trabajar() {System.out.println("trabajando como persona");}
}

public class TrabajadorRobot extends Trabajador
{
public void Trabajar() {System.out.println("trabajando como robot");}
}

el problema es que si vas a crear un nuevo descendiente de Trabajador por ejemplo TrabajadorAnimal este tendrá como comportamiento predeterminado no hacer nada, entonces la solución es poner como método abstracto para que el programador que se encargue de implementar la clase TrabajadorAnimal esté obligada a ponerle algun comportamiento, ahora donde está la gracia de esto? es que debemos pensar que no siempre vamos a ser nosotros los encargados de implementar otras clases derivadas, sino que puede ser otra persona, entonces de esta manera le estamos mostrando nuestras reglas a seguir e implementar.

saludos

Arcioneo
17-08-2007, 13:33:32
Te obliga a la de a huevo (forsozamente) a que tengas que hacer(al menos declarar) esos métodos, aunque a simple vista parece inútil, cuando desarrollas para que a posteriori otros programadores lo utilicen, pues resulta mas comodo ver que en la clase abstracta hay un método que yo llamo con ciertos parametro y me regresa esto de tal forma, ya asi no mre preocupa como lo implementaron...

Y bueno, el segundo y mas importante punto, en java no hay polimorfismo, gracias a las clases abstractas se puede realizar por asi decirlo, una emulación del mismo:D

__hector
17-08-2007, 19:29:01
Que en java no hay polimorfismo?? Querras decir quizas, que no hay herencia multiple, pero polimorfismo claro que hay.