Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1.1 Conceptos
Conceptos
Introducción
Un objeto contiene toda la información que permite definirlo e identificarlo frente a otros
objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder
tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de
mecanismos de interacción llamados métodos, que favorecen la comunicación entre ellos.
Esta comunicación favorece a su vez el cambio de estado en los propios objetos. Esta
característica lleva a tratarlos como unidades indivisibles, en las que no se separa el estado
y el comportamiento.
La programación orientada a objetos es una forma de programar que trata de encontrar una
solución a estos problemas. Introduce nuevos conceptos, que superan y amplían conceptos
antiguos ya conocidos. Entre ellos destacan los siguientes:
Clase
Herencia
Objeto
Método
Evento
Es un suceso en el sistema (tal como una interacción del usuario con la máquina, o un
mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado
al objeto pertinente. También se puede definir como evento la reacción que puede
desencadenar un objeto; es decir, la acción que genera.
Atributos
Mensaje
Una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con
ciertos parámetros asociados al evento que lo generó.
Propiedad o atributo
Contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace
los datos visibles desde fuera del objeto y esto se define como sus características
predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún método.
Estado interno
Es una variable que se declara privada, que puede ser únicamente accedida y alterada por un
método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto
(o clase de objetos). No es visible al programador que maneja una instancia de la clase.
Componentes de un objeto
Identificación de un objeto
Un objeto se representa por medio de una tabla o entidad que esté compuesta por sus
atributos y funciones correspondientes.
Características de la POO
Abstracción
Encapsulamiento
Significa reunir todos los elementos que pueden considerarse pertenecientes a una misma
entidad, al mismo nivel de abstracción. Esto permite aumentar la cohesión de los
componentes del sistema. Algunos autores confunden este concepto con el principio de
ocultación, principalmente porque se suelen emplear conjuntamente.
Modularidad
Principio de ocultación
Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone
una interfaz a otros objetos que especifica cómo pueden interactuar con los objetos de la
clase. El aislamiento protege a las propiedades de un objeto contra su modificación por
quien no tenga derecho a acceder a ellas; solamente los propios métodos internos del objeto
pueden acceder a su estado. Esto asegura que otros objetos no puedan cambiar el estado
interno de un objeto de manera inesperada, eliminando efectos secundarios e interacciones
inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos
internos del objeto de una manera controlada y limitando el grado de abstracción. La
aplicación entera se reduce a un agregado o rompecabezas de objetos.
Polimorfismo
Herencia
Las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de
clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a
las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento,
permitiendo a los objetos ser definidos y creados como tipos especializados de objetos
preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que volver
a implementarlo. Esto suele hacerse habitualmente agrupando los objetos en clases y estas
en árboles o enrejados que reflejan un comportamiento común. Cuando un objeto hereda de
más de una clase se dice que hay herencia múltiple.
Recolección de basura
Tipos de clases
Una parte muy importante de la programación orientada a objetos son las clases, si no fuera
por ellas ni siquiera habría objetos. Cada una tiene sus propias características y ventajas. Un
programador que conoce estas características sabe cuando debe usar una y no otra, de
manera que su desarrolla un buen software. Los tipos de clases son:
Clase definida por Atributo(Class. Public): Son muy comunes, accesibles desde
cualquier otra clase en la misma librería (de otro modo hay que importarlas).
Clase definida por Operaciones(Class. Abstract): Aquellas que tienen por lo
menos un método abstracto. No implementan sus métodos, sino que dan las bases
para que sean implementados en la herencia.
Clase de Servicio(Class. Final): Son las que terminan la cadena de herencia. Útiles
por motivos de seguridad y eficiencia de un programa, ya que no permiten crear
más sub-divisiones por debajo de esta clase.
Class. Synchronizable: Especifica que sus métodos son sincronizados, evitando
problemas con los thread (hilo de ejecución), de forma que estos no pueden empezar
a correr un método si no ha acabado el otro.
Hola mundo
Tipos de datos
Debido a que las variables contienen o apuntan a valores de tipos determinados, las
operaciones sobre las mismas y el dominio de sus propios valores están determinadas por el
tipo de datos en cuestión. Algunos tipos de datos usados:
Tipo de dato lógico.
· Tipo de dato cadena
· int (entero)
Otros tipos de datos que pueden ser considerados primitivos ya que la mayoría de lenguajes
de programación así los proporcionan (aunque no todos) son:
· booleano (lógico: Verdadero, Falso)
· Puntero (dirección de memoria)
Ámbito
Respecto al ámbito de una variable, éste puede ser:
Si bien es cierto, que de una forma básica, se puede definir el ámbito de las variables de la
forma expuesta más arriba, existen grados de globalidad de las mismas, pudiendo ser
accesibles desde unos puntos u otros, o incluso pudiendo ser accesibles entre aplicaciones
distintas, llegando al caso de la superglobalidad.
Ejemplo del ámbito de una variable en el lenguaje de programación Pascal.
programa ejm01;
uses sysutils;
//Defincion
type
A = Class
private
public
procedure Metodo();
procedure otrometedo();
end;
//Implementacion
procedure A.metodo();
var
begin
num:=1;
for i:=0 to numeroEntero do
num:=num*i;
result:=0;
end;
procedure A.otrometodo();
var
begin
num:=1;
end;
Herencia
En orientación a objetos la herencia es, después de la agregación o composición, el
mecanismo más utilizado para alcanzar algunos de los objetivos más preciados en el
desarrollo de software como lo son la reutilización y la extensibilidad. A través de ella los
diseñadores pueden crear nuevas clases partiendo de una clase o de una jerarquía de clases
preexistente (ya comprobadas y verificadas) evitando con ello el rediseño, la modificación y
verificación de la parte ya implementada. La herencia facilita la creación de objetos a partir
de otros ya existentes e implica que una subclase obtiene todo el comportamiento (métodos)
y eventualmente los atributos (variables) de su superclase.
Es la relación entre una clase general y otra clase más específica. Por ejemplo: Si
declaramos una clase párrafo derivada de una clase texto, todos los métodos y variables
asociadas con la clase texto, son automáticamente heredados por la subclase párrafo.
La herencia es uno de los mecanismos de los lenguajes de programación orientada a objetos
basados en clases, por medio del cual una clase se deriva de otra de manera que extiende su
funcionalidad. La clase de la que se hereda se suele denominar clase base, clase
padre, superclase, clase ancestro (el vocabulario que se utiliza suele depender en gran
medida del lenguaje de programación).
En los lenguajes que cuentan con un sistema de tipos fuerte y estrictamente restrictivo con
el tipo de datos de las variables, la herencia suele ser un requisito fundamental para poder
emplear el Polimorfismo, al igual que un mecanismo que permita decidir en tiempo de
ejecución qué método debe invocarse en respuesta a la recepción de un mensaje, conocido
como enlace tardío (late binding) o enlace dinámico (dynamic binding).
Clase abstracta
La herencia permite que existan clases que nunca serán instanciadas directamente. En el
ejemplo anterior, una clase "perro" heredaría los atributos y métodos de la clase
"mamífero", así como también "gato", "delfín" o cualquier otra subclase; pero, en ejecución,
no habrá ningún objeto "mamífero" que no pertenezca a alguna de las subclases. En ese
caso, a una clase así se la conocería como Clase Abstracta. La ausencia de instancias
específicas es su única particularidad, para todo lo demás es como cualquier otra clase.
Dependiendo del lenguaje que se utilice, el diseñador también puede controlar qué
miembros de las superclases son visibles en las subclases. En el caso de java y C++ los
especificadores de acceso (private, protected, public) de los miembros de la superclase
afectan también a la herencia:
Private
Protected
Los miembros protegidos de la superclase son visibles en la subclase, pero no visibles para
el exterior.
Public
Redefinición de métodos
En la clase derivada se puede redefinir algún método existente en la clase base, con el
objeto de proveer una implementación diferente. Para redefinir un método en la subclase,
basta con declararlo nuevamente con la misma signatura (nombre y parámetros). Si se
invoca un cierto método de un objeto que no está definido en su propia clase, se dispara la
búsqueda hacia arriba en la jerarquía a la que dicha clase pertenece. Sin embargo, si
existieran dos métodos con la misma signatura, uno en la clase y otro en una superclase, se
ejecutaría el de la clase, no el de la superclase.
Cuando se redefine un método en una clase es posible acceder explícitamente al método
original de su superclase, mediante una sintaxis específica que depende del lenguaje de
programación empleado (en muchos lenguajes se trata de la palabra clave super).
Ejemplo en Pascal:
program Herencia;
uses
sysutils;
type
Mamifero = Class
private
patas:integer;
nombre:String;
public
constructor Mamifero(nom:String;pat:integer);
procedure imprimirPatas();
end;
Perro = Class(Mamifero)
public
constructor Perro(nom:String);
end;
Gato = Class(Mamifero)
public
constructor Gato(nom:String);
end;
constructor Gato.Gato(nom: String);
begin
self.Mamifero(nom,4);
end;
constructor Perro.Perro(nom: String);
begin
self.Mamifero(nom,4);
end;
constructor Mamifero.Mamifero(nom:String;pat:integer);
begin
nombre:=nom;
patas:=pat;
end;
procedure Mamifero.imprimirPatas();
begin
writeln(' Tiene ',patas,' patas - Mamifero');
end;
var
Perrito:Perro;
begin
Perrito:=Perro.Perro('Pantaleon');
Perrito.imprimirPatas();//Está en la clase mamífero
end.
Ejemplo en Java:
import java.io.*;
Introducción
Una excepción en términos de lenguaje de programación es la indicación de un problema
que ocurre durante la ejecución de un programa. Sin embargo la palabra excepción se
refiere que este problema ocurre con poca frecuencia generalmente cuando existe algún
dato o instrucción que no se apega al funcionamiento del programa por lo que se produce un
error. El manejo de excepciones permite al usuario crear aplicaciones tolerantes a fallas y
robustos (resistentes a errores) para controlar estas excepciones y que pueda seguir
ejecutando el programa sin verse afectado por el problema. En lenguaje java estas
excepciones pueden manejarse con las clases que extienden el paquete Throwable de
manera directa o indirecta, pero existen diversos tipos de excepciones y formas para
manejarlas.
Aserciones
Las aserciones ayudan a asegurar la validez del programa al atrapar los errores potenciales e
identificar los posibles errores lógicos del desarrollo. Estas pueden escribirse como
comentarios para apoyar a la persona que desarrolla el programa. Algunos ejemplos son:
Precondiciones y pos condiciones Estas características son utilizadas por los programadores
para hacer un análisis de lo esperado del programa antes y después de su ejecución. Son
importantes porque gracias a ellas se pueden detectar posibles fallas en el programa y
corregirlas. Las precondiciones son verdaderas cuando se invoca a un método, estas
describen las características del método y las expectativas que se tienen en el estado actual
del programa. Si no se cumplen las precondiciones el comportamiento del método es
indefinido por lo que se lanza una excepción que esté preparada o continuar con el
programa esperando el error. Las pos condiciones describen las restricciones en el entorno y
cualquier efecto secundario del método. Es recomendable escribirlas para saber que esperar
en un futuro si es que se hacen modificaciones.
Conclusión
El manejo de excepciones ayuda a lidiar con los errores de una aplicación por medio de la
manipulación del código para hacer programas más robustos. Además existen herramientas
que ayudan a manejarlas tal es el caso de los bloques try (intentar) que encierran el código
que puede lanzar una excepción y los bloques catch (atrapar) que lidian con las excepciones
que surjan. También existen técnicas que el programador utiliza para conocer el posible
funcionamiento del programa y detectar los errores que pueda contener.
Ejemplo de manejo de excepción en Java:
Clases de excepciones
o queños).
o EFault: es una clase base para todas las excepciones de faltas del procesador.
try
{sentencias}
except
Abort;
end;
Bien, con todo lo que hasta ahora hemos podido ver podríamos tratar las excepciones que se
produzcan y responder a cada clase de manera diferente si fuera necesario. Este tratamiento
se utiliza para responder a distintas excepciones en el lugar donde se producen, de manera
tal que podamos recuperarnos del error y poder proseguir el código. El ejemplo más común
es el error de lectura de un archivo, normalmente permitiremos al usuario reintentar la
operación además de cancelarla. Pero recordemos que el evento OnException se produce
en el objeto Application, después de lo cual la ejecución queda a la espera de nuevos
eventos. Debemos encontrar una forma de detectar y corregir el error sin abandonar el
procedimiento en curso.
Ejemplo de manejo de excepción en Java:
import java.io.IOException;
Para hacer mas claridad sobre el tema veamos la Jerarquía de Excepciones de Java (puede
que no se encuentren algunas excepciones, pero se contemplan las mas comunes)
Jerarquía de excepciones
Vemos que se tiene un claro árbol de herencia mediante el cual se pueden definir las
categorías de Excepciones o de Error que se puede dar en el sistema.
La importancia de Prever!!!
Cuando se esta programando debemos tener claro que nuestro código no es perfecto, así
tengamos mucha experiencia en desarrollo siempre esta la posibilidad de que algo falle, sea
por nuestro código o por otros factores, por eso de la importancia de contemplar todo desde
antes, posibles fallos o lo que pueda afectar el sistema.
Veamos un ejemplo Simple:
1private void metodoDividir(int dividendo, int divisor){
2
3 String resultado+=dividendo/divisor;
4 System.out.println(resultado);
5
6}
El metodoDividir(int, int) teóricamente esta bien, claro, a simple vista si
tenemos : dividendo = 4 y divisor = 2 pues el resultado es 2 ......básico....... pero y si
el divisor es 0 ? pues con ese caso puntual el resultado seria el siguiente.
Vemos que nos indican que se produjo una ArithmeticException debido a una división por
cero, además se muestra cual fue la traza del error pasando por el método main hasta
el metodoDividir().
La anterior es una Excepcion simple, algo que se supone no debería pasar, es obvio, no se
puede dividir por cero, o ¿no?.........pues no, en programación no podemos asumir ni
pensar así, ya que muchas veces nos olvidamos de las cosas obvias y las pasamos por alto,
el problema es que eso tan obvio puede detener toda la ejecución del programa.
1try {
2 //Bloque de código que vamos a procesar
3} catch(excepcion) {
//Tratamiento que se le da a la posible excepción
4
} finally {
5 //Bloque de código que se ejecutará despues del try o del
6catch
7}
1.5 Composición
Un sistema orientado a objetos está caracterizado por objetos que interactúan entre sí.
Estas interacciones suponen ciertos tipos de relaciones entre los objetos del sistema.
La semántica que expresa un objeto en el sistema está determinada, en primer lugar,
por las relaciones que éste establece con otros objetos o conjuntos de objetos.
Tomemos como ejemplo un objeto fecha, del que sin establecer ningún tipo de
relación, podría decirse que significa un día del año particular. Pero si relacionamos
ese objeto fecha con un objeto Persona de manera que represente la fecha en que
esa persona nació, en ese contexto dado, el mismo objeto fecha adoptaría un
significado diferente, el de un cumpleaños; aunque sigue siendo una fecha, ahora
tiene otra idea asociada. Las relaciones entre objetos no solo están definidas por los
objetos que participan y la circunstancia que los relaciona, sino también por la cantidad
de objetos (cardinalidad de la relación) y la dirección de la misma. Una relación puede
tener cardinalidad:
y direccionalidad:
bidireccional
Composición
La composición (también conocida como relación asociativa) es un tipo de relación
que se establece entre dos objetos que tienen comunicación persistente. Se utiliza
para expresar que un par de objetos tienen una relación de dependencia para llevar a
cabo su función, de modo que uno de los objetos involucrados está compuesto por el
otro.
De manera práctica, es posible reconocer asociatividad entre dos objetos A y B si la
proposición "A tiene un B" (o viceversa) es verdadera. Por ejemplo: "una computador
tiene un disco duro" es verdadero; por tanto, un objeto computador tiene una relación
de composición con al menos un objeto disco duro.
Los dos conceptos que debes conocer cómo mínimo cuando intentas descifrar la
forma en que tus objetos deben interactuar son Asociación y Composición.
Asociación
La asociación se podría definir como el momento en que dos objetos se unen para
trabajar juntos y así, alcanzar una meta.
Un punto a tomar muy en cuenta es que ambos objetos son independientes entre sí,
veremos un poco más adelante qué implicación tiene esto. Para validar la asociación,
la frase “Usa un”, debe tener sentido:
Composición
En caso contrario, la composición es un tipo de relación dependiente en dónde un
objeto más complejo es conformado por objetos más pequeños. En esta situación, la
frase “Tiene un”, debe tener sentido:
El auto tiene llantas
Y como ésta mini guía no va a mencionar nada de UML. Vamos a ver directamente en
código cómo se verían representadas ambos tipos de relaciones.
Cómo implementar Asociación
Representaremos la relación: El cliente usa tarjeta de crédito.
Código pascal :
type
Customer = Class
private
id:integer;
fistName,lastName:String;
creditCard: CreditCard;
public
constructor Customer();
procedure setCreditCard(creditCards:CreditCard);
end;
constructor Customer.Customer();
begin
//Lo que sea que el construtor haga
end;
procedure Customer.setCreditCard(creditCards: CreditCard);
begin
creditCard = creditCards;
end;
Código java :
public class Customer {
public Customer() {
//Lo que sea que el construtor haga
}
constructor Laptop.Laptop();
begin
//Lo que sea que el construtor haga
keyBoard := KeyBoard.create();
end;
Código Java:
public class Laptop {
public Laptop() {
//Lo que sea que el constructor haga
}
Muy similar, pero hay una gran diferencia: Podemos crear un objeto de tipo
Customer y asignarle un CreditCard más tarde mediante el método
setCreditCard.
En la asociación:
2. Se puede asignar o retirar la tarjeta de crédito, sin que la existencia del
Cliente se vea afectada (No debería verse afectada, esto significa
que Customer no debe tronar si no hay un CreditCard presente).
En la composición:
1. Los objetos que componen a la clase contenedora, deben existir desde el principio.
(También pueden ser creados en el constructor, no sólo al momento de declarar las
variables como se muestra en el ejemplo).
2. No hay momento (No debería) en que la clase contenedora pueda existir sin alguno
de sus objetos componentes. Por lo que la existencia de estos objetos no debe ser
abiertamente manipulada desde el exterior de la clase.
1.6 Atributos y Métodos
public marca;
}
Sencillo, ¿verdad? La clase Coche contiene un atributo (también puede llamarse propiedad,
aunque en programación estructurada, lo llamaríamos variable) llamada marca. Esto está
muy bien, pero tal y como está la clase, no puede hacer nada con ese dato, no le sirve para
nada. Hagamos algo sencillo: que guarde en la propiedad marca el valor que le pasemos.
class Coche {
public marca;
public guardaMarca(parametro) {
this.marca = parametro;
}
}
¿Ves el this? Puede que eso te confunda un poco. Utilizamos this cuando, dentro de un
objeto, nos referimos a un atributo de ese mismo objeto. ¿De todos los objetos de esa
clase? No, sólo de la instancia del objeto que ejecute el método. Ejemplo…
class Coche {
public marca;
public guardaMarca(parametro) {
this.marca = parametro;
}
Esto es: los objetos son independientes unos de otros. Aunque el código de la clase sea
ese, lo que sucede en un objeto no afecta a otros de la misma clase. Piensa en chalets
adosados… Aunque todos se hacen con el mismo plano, lo que tienen dentro es totalmente
distinto. Las personas, los muebles, las conversaciones… Da igual que el plano sea el
mismo, dentro de cada chalet el día a día es distinto del de todos los demás chalets.
Lo mismo pasa con los objetos. Lo que se hace en uno no afecta a otros. Por lo tanto,
con this hacemos referencia a un atributo (o incluso método) dentro de la instancia que
ejecute el método.
Vamos a ver ahora cómo podríamos imprimir por pantalla la marca del coche:
class Coche {
public marca;
public guardaMarca(parametro) {
this.marca = parametro;
}
public escribeMarca() {
print this.marca;
}
}
Muy sencillo. Vamos a poner un par de métodos más que espero sean autodescriptivos, y te
animo a que trates de entenderlos por tu cuenta.
class Coche {
public marca;
public combustible;
public guardaMarca(parametro) {
this.marca = parametro;
}
public escribeMarca() {
print this.marca;
}
public circular(km) {
this.combustible = this.combustible - 4 * km;
}
public repostar(litros) {
this.combustible = this.combustible + litros;
}
Con esa funcionalidad, la clase coche se acerca mucho más a la realidad, ¿no? Aún
quedarían muchas cosas por comprobar: que no pueda llenarse el depósito hasta
tener un millón de litros, no poder circular si no tenemos combustible… Pero esas
cosas voy a dejarlas como prácticas para ti, si quieres hacerlas.
Puedes escribir en los comentarios (utiliza la etiqueta <pre> y pega código entre ellas,
que así te respeta las tabulaciones) si quieres, y le echo un ojo. Hay algo que quiero
ver en este artículo sí o sí: los métodos especiales.
Métodos especiales: el constructor y el destructor
A veces nos interesará crear un objeto que tenga ya datos dentro, o que esos datos
dependan de algunos cálculos, o simplemente que no se pueda crear un objeto vacío.
Vamos a cambiar de ejemplo y utilizaremos una clase nueva: la clase Persona. Una
persona no puede existir, en el mundo real, sin un nombre y una fecha de nacimiento.
Por lo tanto, tendrá nombre y edad en todo caso, y no debería haber personas
registradas sin nombre y sin fecha de nacimiento.
Vamos a pensar que todo esto es real y creemos una clase que siempre tendrá datos
de inicio, mediante el método constructor.
class Persona {
public nombre;
public edad;
}
El método constructor tiene diversas restricciones que dependerán del lenguaje en el que
trabajemos. Por ejemplo, en C# y Java el constructor se llama igual que la clase, sin
excepción. En Pascal se llama Create() y no es necesario que haya parámetros.
El ejemplo que he puesto se parece más a Java o C# ya que, como ves, hay un método que
se llama igual que la clase y que es, efectivamente, el constructor.
otra ocasión lo de validar los datos porque no sería correcto pero sí posible -en este
caso y con este código- que la persona se llamara ” ” y tuviera -6 años).
Ámbito de métodos y atributos en un objeto: this
¿Sería posible omitir this? Sí, lo es, pero cuando no hay conflictos en los nombres de los
atributos, métodos y parámetros. Un ejemplo:
class Persona {
public nombre;
public edad;
Unit Complejos;
Interface
Type
TComplejo = class
ParteReal,ParteImag:double;
Constructor Crear(i:double); //sobrecargado, crea un imaginario puro
Constructor Crear(r,i:double); //sobrecargado
Function ObtReal:double;
Function ObtImag:double;
Procedure PonReal(n:double);
Procedure PonImag(n:double);
Function ObtCad(dec:integer):string;
Function PonCad(n:string):integer;
Procedure Adicion(n:TComplejo);
Procedure Multiplicacion(n:TComplejo);
End;
Implementation
Constructor TComplejo.Crear(i:double);
Begin
ParteReal:=0;
ParteImag:=i
End;
Constructor TComplejo.Crear(r,i:double);
Begin
ParteReal:=r;
ParteImag:=i;
End;
Function TComplejo.ObtReal:double;
Begin
ObtReal:=ParteReal
End;
Function TComplejo.ObtImag:double;
Begin
ObtImag:=ParteImag
End;
Procedure TComplejo.PonReal(n:double);
Begin
ParteReal:=n;
End;
Procedure TComplejo.PonImag(n:double);
Begin
ParteImag:=n
End;
Function TComplejo.ObtCad(dec:integer):string;
var aux1,aux2,p:string;
Begin
p:='';
Str(ParteReal:0:dec,aux1);
Str(ParteImag:0:dec,aux2);
if ParteImag>=0 then p:='+';
ObtCad := aux1 + p + aux2 + 'i';
End;
Function TComplejo.PonCad(n:string):integer;
Var aux:string;
p,i,error:integer;
PR,PI:string;
encontro:boolean;
Begin
aux:=n;
ParteReal:=0;
ParteImag:=0;
error:=0;
if (aux[length(aux)]='i') and (Not(aux[length(aux)-1]in['0'..'9']))
then aux:=Copy(aux,1,length(aux)-1)+'1i';
if aux[length(aux)]='i' then
Begin
delete(aux,length(aux),1);
if aux[length(aux)] in ['0'..'9']
then Begin
i:=length(aux);
encontro:=false;
p:=0;
while (not encontro) and (i>1) do
Begin
if (aux[i]='+') or (aux[i]='-')
then Begin
encontro:=true;
p:=i
end;
i:=i-1
End;
PR:=Copy(aux,1,p-1);
delete(aux,1,p-1);
PI:=aux;
Val(PR,ParteReal,error);
Val(PI,ParteImag,error);
if error<>0 then
Begin
ParteReal:=0;
ParteImag:=0
End
End;
End
else
Begin
Val(aux,ParteReal,error);
End;
PonCad:=error
End;
Procedure TComplejo.Adicion(n:TComplejo);
Begin
PonReal(ObtReal+n.ObtReal);
PonImag(ObtImag+n.ObtImag)
End;
Procedure TComplejo.Multiplicacion(n:TComplejo);
var PR,PI:double;
Begin
PR:=(ObtReal*n.ObtReal)-(ObtImag*n.ObtImag);
PI:=(ObtReal*n.ObtImag)+(ObtImag*n.ObtReal);
PonReal(PR);
PonImag(PI)
End;
End.
Uses Complejos;
Var A,B:TComplejo;
Begin
A:=TComplejo.Crear(10,4);
B:=TComplejo.Crear(1);
Writeln('A=',A.ObtCad(0));
Writeln('B=',B.ObtCad(0))
End.
Ejemplo
/* Métodos sobrecargados */
int calculaSuma(int x, int y, int z){
...
}
int calculaSuma(double x, double y, double z){
...
}
Ejemplo
/* Usuario4.java */
class Usuario4
{
String nombre;
int edad;
String direccion;
Usuario4(Usuario4 usr)
{
nombre = usr.getNombre();
edad = usr.getEdad();
direccion = usr.getDireccion();
}
void setNombre(String n)
{
nombre = n;
}
String getNombre()
{
return nombre;
}
void setEdad(float e)
{
edad = (int)e;
}
int getEdad()
{
return edad;
}
void setDireccion(String d)
{
direccion = d;
}
String getDireccion()
{
return direccion;
}
}
Ejemplo
/* ProgUsuario4.java */
class ProgUsuario4
{
void imprimeUsuario(Usuario4 usr)
{
// usr.nombre equivale en este caso a usr.getNombre()
System.out.println("\nNombre: " + usr.nombre );
System.out.println("Edad: " + usr.getEdad() );
System.out.println("Direccion: " + usr.getDireccion() +"\n");
}
usr1.setEdad(50);
usr2.setEdad(30.45f);
prog.imprimeUsuario(usr1);
prog.imprimeUsuario(usr2);
}
}
Tipos de Clases
Clases abstractas
Clases finales
Clases especiales que no pueden tener descendencia.
Permiten instanciar objetos.
Ejemplos:
Clase abstracta.
Una de las características más útiles de cualquier lenguaje orientado a objetos es la
posibilidad de declarar clases que definen como se utiliza solamente, sin tener que
implementar método. Esto en Java se hace mediante interfaces y con clases abstractas.
Una clase abstracta es una clase de la que no se puede crear objetos. La utilidad de estas
clases estriba en que otras clases hereden de ésta, por lo que con ello conseguiremos
reutilizar código. Para declarar una clase como abstracta utilizamos la palabra clave
abstract.
Una clase abstracta…
Es una clase que no se puede instanciar.
Se usa únicamente para definir subclases.
¿Cuándo es una clase abstracta?
Cuando deseamos definir una abstracción que englobe objetos de distintos tipos y
queremos hacer uso del polimorfismo.
Polimorfismo: se refiere a la posibilidad de definir clases diferentes que tienen métodos o
atributos denominados de forma idéntica, pero que se comportan de manera distinta.
abstract class FiguraGeometrica {
. . .
abstract void dibujar();
. . .
}
class Circulo extends FiguraGeometrica {
. . .
void dibujar() {
// codigo para dibujar Circulo
. . .
}
}
Se pueden crear referencias a clases abstractas como cualquier otra. No hay ningún
problema en poner:
FiguraGeometrica figura;
Sin embargo una clase abstracta no se puede instanciar, es decir, no se pueden crear objetos
de una clase abstracta. El compilador producirá un error si se intenta:
FiguraGeometrica figura = new FiguraGeometrica();
Esto es coherente dado que una clase abstracta no tiene completa su implementación y
encaja bien con la idea de que algo abstracto no puede materializarse. Sin embargo
utilizando el up-casting visto dedicado a la Herencia si se puede escribir:
FiguraGeometrica figura = new Circulo(. . .);
figura.dibujar();
Este es uno de los conceptos esenciales de una programación orientada a objetos. Así
como la herencia está relacionada con las clases y su jerarquía, el polimorfismo se
relaciona con los métodos.En un lenguaje de programación que cuenta con un
sistemas de tipo dinámico (en los que las variables pueden contener datos de
cualquier tipo u objetos de cualquier clase) .
Tipos de polimorfismo:
Polimorfismo de sobrecarga
Polimorfismo paramétrico
Polimorfismo de inclusión
El polimorfismo de sobrecarga
Ocurre cuando las funciones del mismo nombre existen, con funcionalidad similar, en
clases que son completamente independientes una de otra (éstas no tienen que ser
clases secundarias de la clase objeto). Por ejemplo, la clase complex, la clase imagen
y la clase link pueden todas tener la función "display". Esto significa que no
necesitamos preocuparnos sobre el tipo de objeto con el que estamos trabajando si
todo lo que deseamos es verlo en la pantalla.
Polimorfismo paramétrico
Polimorfismo paramétrico
Ejercicio:
class Mamifero {
public void mover() {
System.out.println("Ahora es un mamifero el que se mueve");
}
}
class Perro extends Mamifero {
public void mover() {
System.out.println("Ahora es un perro el que se mueve");
}
}
class Gato extends Mamifero {
public void mover() {
System.out.println("Ahora es un gato el que se mueve");
}
}
public class Polimorfismo {
public static void muevete(Mamifero m) {
m.mover();
}
public static void main(String[] args) {
Gatobisho = new Gato();
Perrofeo = new Perro();
muevete(bisho);
muevete(feo);
}
}
Clases abstractas
Ejercicio: