POO (Programación Orientada A Objetos)
POO (Programación Orientada A Objetos)
POO (Programación Orientada A Objetos)
· Una clase es una plantilla que permite definir un conjunto de objetos, por ejemplo, un
automóvil es una clase de objetos caracterizados por tener motor, cuatro ruedas, etc. Un
Opell Vectra y un Renault Megane son objetos automóviles particulares que se obtienen
instanciando la clase automóvil para esos casos particulares.
Es necesario definir una clase antes de poder crear una instancia(objeto)de la clase. En
el diseño orientado a objetos, se definen los atributos externos de un objeto y los
métodos que exporta. El resto de información quedará oculta
Para nuestro problema podríamos definir la clase encuesta, la cual tendrá como atributos un
número entero llamado cantidadDePreguntas el cual almacenará la cantidad de preguntas
que el usuario desee ingresar y un arreglo de objetos de otra clase llamado preguntas.
La clase pregunta tendrá un atributo llamado pregunta qué será de tipo string y un arreglo
de String llamado opciones con las posibles respuestas, donde en la posición 0 se ubicará
la respuesta correcta.
Python
class Encuesta:
def _init_(self):
self.catidadDePreguntas = 0
self.preguntas = []
Operaciones:
Una operación es una función o transformación que puede ser aplicada por o sobre objetos
de una clase. Cada operación tiene a un objeto determinado como argumento implícito y el
comportamiento de la operación depende de la clase de este objeto.
Toda clase debe contar con un método constructor. Este método es invocado al momento
de ejecutar la instrucción: new(en java), lo que ocurre en .python es que los atributos se
declaran en éste método, así que cada vez que se llama a la clase se llama al constructor
que se declara como def_init_(self):(en python). Estas operaciones se tiene la costumbre de
llamar por un verbo en infinitivo -que describe una acción-, como se observa en el ejemplo
de polimorfismo más adelante con la operación de h acer un sonido.
Encapsulamiento
Permite proteger los atributos y los métodos para que solo puedan ser accedidos desde
ciertas partes y así se puedan proteger.
Público (Public): Todos pueden acceder a los datos o métodos de una clase que se definen
con este nivel, este es el nivel más bajo, esto es lo que tu quieres que la parte externa vea.
Protegido (Protected): Podemos decir que estas no son de acceso público, solamente son
accesibles dentro de su clase y por subclases.
Privado (Private): En este nivel se puede declarar miembros accesibles sólo para la propia
clase.
En java si usamos la palabra private a un atributo indica que no puede ser modificado a
menos que sea desde métodos de la misma clase.
Java
//Atributos
Python
class Persona:
def _init_(self):
Herencia
La herencia, que es una forma de reutilización de software en la que se crea una nueva
clase absorbiendo los miembros de una clase existente, y se mejoran con nuevas
capacidades, o con modificaciones en las capacidades ya existentes. Al crear una clase,
en vez de declarar miembros completamente nuevos, el programador puede designar
que la nueva clase hereda los miembros de una clase existente. Esta clase existente se
conoce como superclase, y la nueva clase se conoce como subclase. Cada subclase
puede convertirse en la superclase de futuras subclases.
Si analizamos en nuestro problema, las preguntas pueden ser de diferentes tipos, en este
caso consideraremos tres tipos de preguntas: preguntas de selección múltiple, preguntas de
verdadero o falso y preguntas de completar, es evidente que cada pregunta tendrá atributos
similares, así que vamos a definir la clase pregunta como clase padre y las clases que
heredarán de ella serán la clase pregunta de selección múltiple, pregunta de verdadero y
falso y pregunta de completar.
Java
Python
class Preguntas:
def _init_(self):
self.respuestaCorrecta = ‘’
def getPregunta(self):
return self.pregunta
def getRepuestaCorrecta(self):
return self.respuestaCorrecta
--
class SeleccionMultiple(Preguntas):
def _init_(self):
Preguntas.__init__(self)
# Nuevos atributos
En aquellos casos donde se necesita crear una clase que, además de otros propios, deba
incluir los métodos definidos en otra, la herencia evita tener que reescribir todos esos
métodos en la nueva clase.
Clases abstractas:
Una clase abstracta es una clase sin instancias directas. Contiene una o más operaciones
abstractas. Una operación abstracta es aquella que se declara pero no se implementa. Una
clase abstracta no puede ser instanciada y requiere que clases que la especialicen provean
implementaciones para las operaciones abstractas. Una clase abstracta puede tener
operaciones con código funcional. Por ejemplo tenemos una superclase de ser vivo -es
decir, la clase que generaliza- que tiene el método abstracto de alimentarse, por lo que al
tener una operación abstracta la clase se vuelve abstracta, y esta superclase tiene dos
clases hijas(que especializan) planta que implementa el método de alimentarse y animal
que es superclase abstracta ya que también tiene el método alimentarse abstracto, porque
es superclase de carnívoro y herbívoro que son otras 2 clases hijas que implementan el
método de alimentarse. En diagrama de clases se vería así:
Java
---
---
public abstract class Animal extends SerVivo {
---
@Override
---
@Override
Python
class SerVivo {
def alimentarse(self):
pass
---
class Planta(SerVivo):
def alimentarse(self):
---
class Animal(SerVivo):
def alimentarse(self):
pass
---
class AnimalCarnivoro(Animal):
def alimentarse():
---
class AnimalHerbivoro(Animal):
def alimentarse():
Polimorfismo:
Vamos entonces a implementar en java la clase animal de la cual heredará la clase gato y la
clase perro. La clase animal tiene un método para hacer un sonido, pero sus clases hijas lo
implementaran de diferente manera, ya que ambos realizan sonidos diferentes.
Java
Python
class Animal:
def hacer_un_sonido(self):
print(“Grr...”)
class Gato(Animal):
def hacer_un_sonido(self):
print(“Meow”)
class Perro(Animal):
def hacer_un_sonido(self):
print(“Woof”)
Ahora vamos a analizar otro caso de polimorfismo conocido como sobrecarga. Siguiendo
con el mismo ejemplo de los animales, vamos a trabajar con la clase perro, ahora
deseamos que el perro no solo haga un sonido por defecto, sino que haga diferentes
dependiendo de su ánimo, por lo que haremos una sobrecarga, es decir, un método con el
mismo nombre pero con variación en los argumentos.
Java
System.out.println(“Woof”);
System.out.println(“Grrr...”);
if(animo == miedo){
System.out.println(“nnnnnn”);
Python
class Perro(Animal):
def hacer_un_sonido(self):
print(“Woof”)
if(animo == enojo):
print(“Grrr...”)
if(animo == miedo):
print(“nnnnnn”)
Bibliografía:
● Programación orientada a objetos con Java Escrito por Francisco Durán, Francisco Gutiérrez,
Ernesto Pimentel
● Java, como programar. P.J Deitel, H.M Deitel