Java - Duda con herencia por delegacion en JAVA

   
Vista:

Duda con herencia por delegacion en JAVA

Publicado por Guillermo Rodriguez (5 intervenciones) el 28/11/2016 13:55:47
Hola muy buenas estoy con el tema de herencia por delegacion y tengo una duda....

Tengo 3 clases que se llaman Student,Result y Exam.

La clase result hereda de Student, hasta aqui todo bien....El caso es que sin usar implementacions quiero llamar a un metodo de la clase Exam, pues bien lo que hago es en la clase Result creo una instancia a Exam...

Todo bien pero evidentemente en el metodo de la clase instanciada no puedo llamar a atributos de la clase Student y no puedo hacer lo que se me pide...Os dejo el codigo por si a alguien se le ocurre como hacerlo...

Clase Student:
--------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class Student {
 
    public String name;
    public int roll_no,mark1,mark2;
 
    public Student(String name, int roll_no, int mark1, int mark2) {
        this.name = name;
        this.roll_no = roll_no;
        this.mark1 = mark1;
        this.mark2 = mark2;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getRoll_no() {
        return roll_no;
    }
 
    public void setRoll_no(int roll_no) {
        this.roll_no = roll_no;
    }
 
    public int getMark1() {
        return mark1;
    }
 
    public void setMark1(int mark1) {
        this.mark1 = mark1;
    }
 
    public int getMark2() {
        return mark2;
    }
 
    public void setMark2(int mark2) {
        this.mark2 = mark2;
    }
 
}

Clase Result
---------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Result extends Student {
 
    private final String NL = System.getProperty("line.separator");
 
    public Result(String name, int roll_no, int mark1, int mark2) {
        super(name, roll_no, mark1, mark2);
    }
 
   Exam instancia = new Exam();
 
    public String display() {
 
      StringBuilder sb = new StringBuilder();
      sb.append("Name of Student: " +this.name + NL);
      sb.append("Roll No. of Student: "+ this.roll_no  + NL);
      sb.append("Marks of Subject 1: "+this.mark1  +NL);
      sb.append("Marks of Subject 2: "+this.mark2 +NL);
 
      System.out.println(sb.toString());
 
      return sb.toString();
    }
      public void percent_cal(){
          instancia.percent_cal();
      }
}


Clase Exam
------------------
1
2
3
4
5
6
7
8
public  class Exam {
 
    public void percent_cal(){
      System.out.println("hola");
 
   }
 
}


Tengo claro que puedo acceder al metodo de exame pero es que quiero llamar a los atributos de Result y evidentmente no se puede....Mi pregunta es...Sin usar implementacion como puedo resolver esto?

Probe ya muchas cosas pero nada...

Un saludo!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Lawliet

Duda con herencia por delegacion en JAVA

Publicado por Lawliet zhapyro_5@hotmail.com (249 intervenciones) el 28/11/2016 18:44:09
Hola...

Hasta donde yo tengo entendido, la HERENCIA consiste en sacar un "factor común" de los atributos entre clases o más técnicamente sería que una clase principal herede los atributos y/o métodos comunes entre clases a sus clases hijas. Por lo que veo en tus clases cada una de ellas tiene conceptos diferentes, un Estudiante obtiene un resultado en un Examen más no es un Examen, sería más lógico decir que un Estudiante es una Persona y esa persona obtiene un resultado en un Examen.

Ahora si gustas explicar el concepto de DELEGACIÓN, posiblemente sea más fácil para mi poder ayudarte ya que por lo menos recordando las definiciones de Programación Orientada a Objetos, no veo aplicada de manera correcta la HERENCIA en tus clases.

Sin más que comentar, quedo al pendiente de cualquier duda y/o comentario.

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda con herencia por delegacion en JAVA

Publicado por Tom (1047 intervenciones) el 28/11/2016 20:54:39
¿ Herencia por delegación ? ¿ Seguro que va de eso el tema ?

Puedes conseguir algo parecido a los "delegates" de otros lenguajes., utiizando "agregación".
Una clase contiene varios tipos de objetos (Student, Result, Exam) y una serie de métodos con el mismo nombre y parámetros (generalmente) que loas clases de los objetos que contiene.

En la implementación de estos métodos, lo que haces es invocar el equivalente del objeto correspoindiente.

1
2
3
4
5
6
7
class MyClass {
  private String myString;
 
  public char charAt(int index) {
    return myString.charAt(index);
  }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda con herencia por delegacion en JAVA

Publicado por Guillermo Rodriguez (5 intervenciones) el 29/11/2016 07:56:40
Puede que tengas razon en lo que me dices.

Cree un objeto Exam en la clase Result para poder interactuar con exam pero no se como resolver el metodo percent_cal para que me pueda acceder a los atributos de Result..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda con herencia por delegacion en JAVA

Publicado por Guillermo Rodriguez (5 intervenciones) el 29/11/2016 07:54:51
Hola muy buenas ,te comento.

Efectivamente como tu bien dices el planteamiento deberia ser que Result herede de Student y Exam herede de Student.Estoy totalmente deacuerdo contigo.

Con implementacion lo hice sin problemas pero no quiero usar implements,quiero hacerlo con herencia simple.

Voy a poner el main para que se vea a los metodos que llama.

Main
-------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Main
{
    /**
     * main method
     * @param args arguments
     */
	public static void main(String args[])
	{
 
               //Create a result
		Result R = new Result("Ra.one",12,93,84);
		//display a result
                R.display();
                //calculate a result
        	R.percent_cal();
 
	}
}

Como podemos ver creamos un objeto Result y este objeto llama a los metodos display y percent_cal.

El tema es que percent_cal esta definido en Exam ,por eso creo ese metodo en Result y lo llamo desde dentro.

El metodo percent_cal debe mostrar en pantalla mark1+mark2*100/200 que con la implementacion lo resolvi asi

1
2
3
public void percent_cal() {
      System.out.println("Percentage: " + ((this.mark1+this.mark2)*100/200+".0%"));
}

Pero claro usando implementacion pero no quiero hacerlo con implements.

No se como plantear esto.

Espero que con esto quede algo mas claro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar