Programación Avanzada.
Centro Superior de Informática.
Universidad de La Laguna.


Diseño y Extensión de Clases Abstractas.

 
  1. Considere el diseño de una clase genérica que implemente las operaciones de suma y producto de matrices  de cualquier tipo (en próximos ejercicios se utilizará una matrix de enteros y una matriz de Racionales para comprobar su funcionamiento).
    La estructura de la clase podría ser la siguiente (el fichero está aquí):
    public abstract class GenericMatrix {
      private Object[][] matrix;

      // constructor
      public GenericMatrix(Object[][] matrix);

      // suma de matrices, se devuelve una nueva matriz
      public Object[][] addMatrix(Object[][] matrix);

      // producto de matrices, se devuelve una nueva matriz
      public Object[][] multiplyMatrix(Object[][] matrix);

      public abstract Object add(Object o1, Object o2);

      public abstract Object multiply(Object o1, Object o2);

      public abstract Object zero();

      public static void displayMatrix(Object[][] m);
    }

Puesto que no se especifica el tipo de los elementos de las matrices el programa no puede saber como sumar o multiplicar dos elementos de las matrices. Tampoco sabe cual es el elemento neutro (con valor cero) de sus tipos (por ejemplo, 0 para el tipo int o 0/1 para los de tipo Rational). Por lo tanto es necesario definir métodos abstractos: add(), multiply() y zero(). Estos métodos deben ser implementados en las subclases en las que se especifica el tipo de los elementos de la matriz.

Los elementos de la matriz genérica serán instancias de la clase Object. Esto proporciona al usuario la posibilidad de utilizar cualquier tipo de datos para los elementos de las matrices en las subclases.

Se han de definir e implementar dos métodos concretos en la clase genérica: addMatrix() y multiplyMatrix() . Estos métodos estarán listos para usarse en cuanto los métodos add(), multiply() y zero() sean implementados.  Estos métodos han de comprobar las dimensiones de las matrices antes de realizar las operaciones. Si dos matrices tienen dimensiones incompatibles el programa debería terminar. A continuación se muestra un ejemplo en el caso de que el tipo de las matrices sea entero:

 
0  0  0  0 
1  1  1  1 
2  2  2  2 
3  3  3  3 
+ 0  1  2  3 
1  2  3  4 
2  3  4  5 
3  4  5  6 
= 0  1  2  3 
1  2  3  4 
2  3  4  5 
3  4  5  6 
y 0  0  0  0 
1  1  1  1 
2  2  2  2 
3  3  3  3 
* 0  1  2  3 
1  2  3  4 
2  3  4  5 
3  4  5  6 
= 0      0     0    0  
6    10  14  18  
12  20  28  36  
18  30  42  54  
Finalmente se propone implementar un método displayMatrix() para mostrar los elementos de la matriz por pantalla. Para ello utilizar el método toString().
  1. Escriba una clase IntegerMatrix que extienda la clase de matrices genérica para matrices de enteros (Integer).

  2.  
  3. Escriba otra clase RationalMatrix  para matrices de racionales (utilice la clase Rational desarrollada en las prácticas anteriores).
    Para implementar los métodos add(), multiply() y zero() es necesario realizar un typecast sobre los operandos de tipo Object puesto que en esta clase no está definido el método intValue() en el caso de los enteros, ni los métodos add y multiply en el caso de los racionales.
     
  1. Finalmente escriba clases cliente (TestIntegerMatrix y TestRationalMatrix) en la que se creen matrices, se sumen y se multipliquen.
    Crear una instancia de IntegerMatrix denominada im1, de manera que se pueda utilizar im1.addMatrix(m2) e im1.multiplyMatrix(m2) para realizar la suma y el producto respectivamente, de las matrices m1 y m2. Debería de existir una variable rm1 en el test de RationalMatrix por la misma razón.
     

Bibliografía.

[1] Y. Daniel Liang. "Introduction to Java Programming". QueE&T. 1999
[2] S. Davis. "Aprenda Java ya". McGraw-Hill. Microsoft Press. 1996.
[3] J. Gosling,  H. McGilton. "The Java Language Enviroment". A White Paper. Sun Microsystems. Java Soft. 1996.
[4] J.F. Macary, C. Nicolas. "Programación Java". Eyrolles.