Programación en OO
Lección 4:Programación en OO 1. Herencia 2. Modificadores de Acceso 3. Interfaces
Herencia Es la acción en la que una clase obtiene los métodos y propiedades definidos en otra clase, siempre y cuando no seán privados. Para heredar en java se utiliza la clase reservada extends. Ejemplo: public class SubClases extends SuperClase {}
Herencia A la clase que extiendo se le denomina subclase o clase hija. La clase de la que se extiende se le denomina superclase o clase padre. Ejemplo: class PersonaDAO extends ConexionBaseDatos {} Superclase: ConexiónBaseDatos Subclase: PersonaDAO
Modificadores de acceso Los modificadores de acceso son: public protected private default (sin modificador)
Modificadores de acceso public: Una clase, variable o método puede ser utilizado en cualquier programa de java sin ninguna restricción. private: El más restrictivo de los modificadores. Una variable o método puede ser utilizado sólo por una instacia de la clase
Modificador de acceso protected: Se le asigna a las variables o métodos que sólo pueden ser accedidos por la clase que los contiene o sus subclases.
Modificadores de acceso default: Es el modificador de acceso que se asigna al no definirle un modificador de acceso. Default, no es una palabra reservada, simplemente es el nombre que se le asigna a la acción que resulta de no especificar un modificador de acceso. Este modificar sólo permite el acceso a clases que se encuentren en el mismo paquete.
Constructores en una subclase Como hemos visto al heredar se obtienen los métodos y variables de la clase padre, pero también se tiene acceso a sus constructores. Para acceder a los constructores de la clase padre se utiliza la palabra reservada super, seguida de los argumentos que requiere el constructor de la clase padre.
Constructores en una subclase La instrucción con la palabra reservada super, debe ser la primera en el cuerpo del constructor. El constructor de la superclase debe ser visible El constructor de la superclase debe ser visible para la subclase es decir debe ser public, protegido y o estar en el mismo paquete, por ningún motivo se puede acceder un constructor privado de la clase hija.
Constructores en una subclase Ejemplo: public class Transaccion extends ControladorConexion implements Conexion { public Transaccion() throws SQLException { super(); } } public Transaccion(int controlador) throws SQLException { super(controlador); }
Heredando y redefiniendo miembros Al igual que con los constructores se tiene acceso a todas las propiedades y métodos que sean accesibles por la subclase, esto es considerando los modificadores de acceso.
Heredando y redefiniendo miembros Ejemplo: public class ControladorConexion { protected Connection sqlconnection; public Connection getconexion() throws ImposibleCrearConexionException {..} } public class Transaccion extends ControladorConexion { //Contiene la variable slqconnection public void commit() throws SQLException{} //Cuenta además con el método getconexion() }
Accediendo miembros heredados Para acceder a los miembros heredados sólo basta con utilizar el nombre de la variable o método.
Sobre escritura de métodos Al igual que lo sobrecarga la sobre escritura es una característica de Java. Utilizar el mismo nombre de método con su Utilizar el mismo nombre de método con su conjunto de argumentos iguales y mismo tipo de retorno se conoce como sobre escritura.
Sobre escritura de métodos La sobre escritura existe cuando: En una subclase se define un método con el mismo nombre, una lista de argumentos idéntica en orden y tipo y con el mismo tipo de retorno, que un método de la superclase. Los métodos marcados con final no pueden ser sobre escritos.
Sobre escritura de métodos La accesibilidad no debe ser más restrictiva que en el método original. El método no debe lanzar ninguna excepción comprobada (o subclases de esas excepciones) que no hayan sido declaradas por los métodos sobre escritos.
La palabra reservada super La palabra reservada super tiene como objetivos: Acceder a las variables ocultas de la superclase super.variableoculta; Acceder a los métodos sobre escritos de la clase padre. super.metodosobreescrito(); Invocar a los constructores de la superclase super(agumentos);
Interfaces Define un conjunto de variables de clase y métodos que especifican sólo la firma de los métodos que debe contener la clase que la implementa. Para definir una interfaz se utiliza la palabra reservada interface. Las interfaces son abstractas implícitamente. Por convención el abstract se omite
Interfaces En una interfaz se pueden declarar tres tipos de miembros Constantes (fields) Métodos Clases internas o interfases
Interfaces - Constantes En una interfaz se pueden declarar constantes, por lo cual los campos (fields) deben serán implícitamente publicas, estáticas y finales. Por convención los modificadores son omitidos en la declaración de los campos. Deben ser inicializadas, ya que variables finales en blanco no son permitidas
Interfaces - Constantes Ejemplo: public interface PerfilDeSeguridad { /** * Tipo de autenticación por base de datos */ String TIPO_BASE_DE_DATOS = seguridad.validacionbd ; } /** * Tipo de autenticación por base de datos */ String TIPO_EMAIL = seguridad.validacionemail ;
Interfaces - Métodos Las interfaces definen la forma de los métodos, pero existen algunas reglas que deben seguirse. Los métodos son abstractos implícitamente, no pueden tener cuerpo. Por convención el abstract se omite en la declaración del método Son públicos implícitamente No se permite ningún otro modificador
Interfaces - Métodos Ejemplo: /** * La interfaz conexión permite tener un método * común en el uso de JDBC * @author ITNova Solutions */ public interface Conexion { /** Este metodo se encarga de obtener una nueva conexión. * @throws java.sql.sqlexception * @return Conexión a la base de datos */ Connection abrirconexion() throws SQLException; } /** Cierra la conexion existente * @throws java.sql.sqlexception */ void cerrarconexion() throws SQLException;
Implementando interfaces Para implementar una interfaz en la declaración de la clase se utiliza la palabra reservada implements, seguida por la lista de interfaces que deseamos implementar. Al implementar una interfaz estamos forzados a implementar todos los métodos que defina.
Implementando interfaces Ejemplo: class ControladorConexion implements Conexión { /** Constructor de la clase */ public ControladorConexion(){ this.seleccionarcontrolador(); } } Connection abrirconexion() throws SQLException { //Implementación del método } void cerrarconexion() throws SQLException { //Implementación del método }
Utilizando interfaces El diseño orientado a interfaces nos permite mantener la abstracción del sistema e implementar su funcionamiento de diferentes maneras.
Uso de interfaces Consideremos el siguiente escenario:
Uso de interfaces Una de las posibles implementaciones de la clase persona: class PersonaDAO { private Conexion conexion; /** Constructor de la clase */ public PersonaDAO(){ //En caso de utilizar Oracle //conexion = new OracleConecion(); conexion = new MySQLConecion(); Connection c = conexion.abrirconexion(); //Implementación del constructor } }
Compatibilidad y tipos de conversión En Java existen dos formas de tener cambios en referencias: Las implícitas o automáticas que son conocidas como conversiones. Las explicitas son hechas a través de un Cast.
Conversion La conversión es permitida cuando es de abajo hacia arriba. Correcto: Tangelo tange = new Tangelo(); Citrus cit = tange; Incorrecto: Citrus cit = new Citrus(); Tangelo tange = cit; //
Cast El Cast es necesario cuando es de arriba hacia abajo. Ejemplo: GrapeFruit g, g1; Citrus c; Tangelo t; g = new GrapeFruit(); c = g; //Conversión //Casting correcto g1 = (GrapeFruit)c; //Casting no permitido t = (Tangelo)t;