Saltar al contenido

Herencia del constructor de Java

Sé libre de divulgar nuestra página y códigos con tus amigos, necesitamos tu ayuda para hacer crecer esta comunidad.

Solución:

Supongamos constructores fueron heredado … entonces porque cada clase eventualmente deriva de Object, cada class terminaría con un constructor sin parámetros. Esa es una mala idea. ¿Qué esperarías exactamente?

FileInputStream stream = new FileInputStream();

¿hacer?

Ahora, potencialmente, debería haber una forma de crear fácilmente los constructores de “paso a través” que son bastante comunes, pero no creo que deba ser el predeterminado. Los parámetros necesarios para construir una subclase son a menudo diferentes de los requeridos por la superclase.

Cuando heredas de Super, esto es lo que en realidad sucede:

public class Son extends Super

  // If you dont declare a constructor of any type, adefault one will appear.
  public Son()
    // If you dont call any other constructor in the first line a call to super() will be placed instead.
    super();
  


Entonces, esa es la razón, porque tienes que llamar a tu constructor único, ya que “Super” no tiene uno predeterminado.

Ahora, tratando de adivinar por qué Java no admite la herencia de constructores, probablemente porque un constructor solo tiene sentido si habla de instancias concretas, y no debería poder crear una instancia de algo cuando no sabe cómo está definido (por polimorfismo).

Porque la construcción de su objeto de subclase se puede hacer de una manera diferente a como está construida su superclase. Es posible que no desee que los clientes de la subclase puedan llamar a ciertos constructores disponibles en la superclase.

Un ejemplo tonto:

class Super 
    protected final Number value;
    public Super(Number value)
        this.value = value;
    


class Sub 
    public Sub() super(Integer.valueOf(0)); 
    void doSomeStuff()
        // We know this.value is an Integer, so it's safe to cast.
        doSomethingWithAnInteger((Integer)this.value);
    


// Client code:
Sub s = new Sub(Long.valueOf(666L)): // Devilish invocation of Super constructor!
s.doSomeStuff(); // throws ClassCastException

O incluso más simple:

class Super 
    private final String msg;
    Super(String msg)
        if (msg == null) throw new NullPointerException();
        this.msg = msg;
    

class Sub 
    private final String detail;
    Sub(String msg, String detail)
        super(msg);
        if (detail == null) throw new NullPointerException();
        this.detail = detail;
    
    void print()
        // detail is never null, so this method won't fail
        System.out.println(detail.concat(": ").concat(msg));
    

// Client code:
Sub s = new Sub("message"); // Calling Super constructor - detail is never initialized!
s.print(); // throws NullPointerException

En este ejemplo, verá que necesitaría alguna forma de declarar que “Quiero heredar estos constructores” o “Quiero heredar todos los constructores excepto estos”, y luego también tendría que especificar una herencia de constructor predeterminada preferencia en caso de que alguien agregue un nuevo constructor en la superclase … o simplemente podría requerir que repita los constructores de la superclase si desea “heredarlos”, que posiblemente sea la forma más obvia de hacerlo.

Si aceptas, puedes dejar una crónica acerca de qué le añadirías a esta división.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *