Duda herencia de constructor

Iniciado por bettu, 26 Octubre 2015, 01:20 AM

0 Miembros y 1 Visitante están viendo este tema.

bettu

Hola,

Estoy realizando una ampliación de una aplicación de clase y me encuentro encallado en el tema de herencia (intentaré explicarme lo mejor posible):

En el ejercicio hay tres clases: Author, Main y Material.
La clase Main no la puedo modificar (normas del enunciado).
Material debe ser la clase heredada de Author.

Realizo la herencia así (adjunto solo una parte de código):

Material.java
Código (java) [Seleccionar]
public class Material extends Author {

/** Maximum number of Authors in any Material */
private static final int MAX_AUTHORS = 3;

/** Material Authors */
private Author[] authors;

/** Authors number */
private int authorsN;

/** Materials Title */
private String title;

/**
* Constructor.
* @param title The title of this material
*/
public Material(String title) { //si lo dejo asi, el compilador me dice que debo hacer modificaciones en la clase Author. Si en vez de (String title) anado (String title, String name) me aparece problema de compilado en la clase main.
super(name); //si en vez de name escribo title el programa me compila bien
this.title = title;
this.authorsN = 0;
}


Añado las lineas en que me da error el compilador en la clase main si el constructor fuera Material (String title, String name):

Main.java
Código (java) [Seleccionar]
public static void main(String args[]) {
   Material m1 = new Material("Object Oriented Programming. Java practices");
   Material m2 = new Material("UML cases");
   Material m3 = new Material("Introduction to Programming");
   Material m4 = new Material("Algebra Theory");
   Material m5 = new Material("Graph Theory");
}


Y añado lo que debo modificar si dejo:
public Material(String title) {
super(name);


Author.java
Código (java) [Seleccionar]
//private String name; original
protected static String name; //lo que debo modificar segun el compilador


Qué hago mal? Qué es lo correcto? Espero haberme explicado bien.


Gracias,

PabloPbl

Creo que el error es por que cuando haces:

Código (java) [Seleccionar]
super(name);

En realidad no le estas pasando nada al constructor de la clase padre de Material, por eso da error. Intenta ponerle un valor a la variable name de la clase Author y creo que no debiera darte error.

Salu2.

bettu

Hola,

No, tengo el mismo problema. Adjunto la clase Author:

Código (java) [Seleccionar]
import java.util.Vector;

public class Author{

/** Name of the Author */
private String name;


/**
* Constructor.
* @param name Name of the author
*/
public Author(String name) {
this.name = name;
}

/**
* Gets the name of the Author
* @return Name of the author
*/
public String getName() {
return this.name;
}


}


Adjunto una parte de la clase Main:
Código (java) [Seleccionar]
public class Main1 {

/**
* Entry point.
* @param args Command-line arguments
*/
public static void main(String args[]) {
    Material m1 = new Material("Object Oriented Programming. Java practices");
    Material m2 = new Material("UML cases");
    Material m3 = new Material("Introduction to Programming");
    Material m4 = new Material("Algebra Theory");
    Material m5 = new Material("Graph Theory");
    Author a1 = new Author("John Pitt");
    Author a2 = new Author("Ella Stallone");
    Author a3 = new Author("Josh MacQueen");
    Author a4 = new Author("Peter Hoffmann");
    Author a5 = new Author("Stella Clooney");
    Author a6 = new Author("George Damon");
    Author a7 = new Author("Sarah Burton");

    // ADD AUTHOR a1 TO MATERIAL m1
    m1.addAuthor(a1);
    // ADD AUTHOR a5 TO MATERIAL m1
    m1.addAuthor(a5);
    // ADD AUTHOR a6 TO MATERIAL m1
    m1.addAuthor(a6);
    // a5 is already author of m1, it should not be added again
    m1.addAuthor(a5);
    m2.addAuthor(a1);
    m3.addAuthor(a2);
    m3.addAuthor(a7);
    m4.addAuthor(a2);
    m4.addAuthor(a4);
    m4.addAuthor(a3);
    // Try to add 1 more author than the maximum number of authors a material can have
    m4.addAuthor(a1);


Y adjunto parte de la clase Material:
Código (java) [Seleccionar]
public class Material extends Author {

/** Maximum number of Authors in any Material */
private static final int MAX_AUTHORS = 3;

/** Material Authors */
private Author[] authors;

/** Authors number */
private int authorsN;

/** Materials Title */
private String title;

/**
* Constructor.
* @param title The title of this material
*/
public Material(String title) {
super(name);
this.title = title;
this.authorsN = 0;
}


Si la clase Material no la modifico y la dejo tal cual está, el compilador dice que no ve la variable name. Si le añado un parametro String name al constructor Material, Eclipse no me compila y me da error en el Main (Material m1 - m5).

Lo que no entiendo es porque si pongo super (title) me compila bien.

DarK_FirefoX

Repito lo que ya te dijeron! Debes leer bien:

Cita de: PabloPbl en 26 Octubre 2015, 06:26 AM
Creo que el error es por que cuando haces:

Código (java) [Seleccionar]
super(name);

En realidad no le estas pasando nada al constructor de la clase padre de Material, por eso da error. Intenta ponerle un valor a la variable name de la clase Author y creo que no debiera darte error.

Salu2.

¿Sabes que hace super()?

Se utiliza para invocar el constructor de la superclase, y dentro de los paréntesis van los parámetros que requiere es constructor.

Por lo tanto, si dices:

Cita de: bettu en 26 Octubre 2015, 09:48 AM
Código (java) [Seleccionar]
public class Material extends Author {

/** Maximum number of Authors in any Material */
private static final int MAX_AUTHORS = 3;

/** Material Authors */
private Author[] authors;

/** Authors number */
private int authorsN;

/** Materials Title */
private String title;

/**
* Constructor.
* @param title The title of this material
*/
public Material(String title) {
super(name); //Énfasis aquí
this.title = title;
this.authorsN = 0;
}


Si la clase Material no la modifico y la dejo tal cual está, el compilador dice que no ve la variable name. Si le añado un parametro String name al constructor Material, Eclipse no me compila y me da error en el Main (Material m1 - m5).

Lo que no entiendo es porque si pongo super (title) me compila bien.

Obvio es que no te vea la variable name, no está definida dentro del ámbito desde el cual estas haciendo referencia. Estas invocando al constructor de la superclase pasándole una variable que no existe como parámetro. Tendrías que ver que lógica tiene tu POO para saber que valor le vas a dar.

De cualquier caso, si al constructor de Material le añades un "String name" es obvio que te de error de compilación en donde dices, pues al instanciar Material desde la clase Main debes darle un valor al parámetro del constructor que añadiste.

Espero entiendas.

Salu2s