2011-03-23 24 views
19

¿Por qué una clase abstracta puede tener un constructor? Como no podemos crear un objeto, ¿por qué necesitaríamos un constructor en una clase abstracta?¿Constructores en clases abstractas?

+9

razón por la generosidad? –

+1

@Kublai Khan: Lo siento, pero no puede hacer esas preguntas sobre el desbordamiento de la pila porque su "pregunta parece ser subjetiva y es probable que se cierre".";) – vinayvasyani

Respuesta

35

En algunos casos, necesitamos inicializar los campos en la clase abstracta. Si es un constructor vacío, esto se hace implícitamente por el constructor en la clase secundaria, de lo contrario usaremos super(parameters). Un constructor con parámetros obliga a la clase secundaria a especificar algunos parámetros (no necesariamente desde sus propios parámetros).

Con todo, esto significa que el constructor es usado por el constructor de clase hijo y no desde el "exterior".

+1

awesome play – developer

1

Las subclases se pueden instanciar y pueden llamar al constructor de la clase abstracta desde su constructor. Ejemplo:

abstract class Foo 
{ 
    public Foo() 
    { 
    // Do Stuff 
    } 
} 

class Bar extends Foo 
{ 
    public Bar() 
    { 
    super(); 
    } 
} 
8

Todavía es necesario ser capaz de crear una subclase que debe llamar al constructor de su matriz y sus padres etc.

La verdadera pregunta es ¿por qué se puede hacer público un resumen de las clases constructor. ;)

1

Piense en una clase abstracta como un modelo de una derivada de hasta 1 o 2 métodos que deben implementarse en las clases derivadas. Tiene sentido implementar tanto como sea posible/sensible en la clase abstracta, incluido el constructor.

2

porque una clase que hereda la clase abstact puede llamar a este constructor

abstract class Foo { 

    private int number; 

    public Foo(int i) { 
     this.number = i; 
    } 
} 

class Bar extends Foo { 

    public Bar() { 
     super(1); 
    } 

} 
0

Las clases abstractas fuerzas constructor que heredan de la clase para implementar (o llamar) al constructor. Esto implica que puede estar seguro de que se ejecutarán todas las operaciones en el constructor de la clase abstracta.

25

Al agregar un constructor a una clase abstracta, puede forzar a las clases secundarias a realizar una llamada a super para inicializar algunos campos. Ejemplo:

 

abstract class Person { 
    private String name; 
    public Person(String name) { 
     this.name = name; 
    } 
} 

class SoccerPlayer extends Person { 
    public SoccerPlayer(String name) { 
    super(name); 
    } 
} 
Person p = new SoccerPlayer("Ronaldo"); 
 
+1

se puede explicar más claramente – developer

+3

+1 para el claro ejemplo –

+0

@marcosbeirigo' forzar a las clases de niños a hacer una llamada a super' - ¿No es necesario agregar también un no-arg privado constructor para lograr el objetivo de forzar a la subclase a llamar al constructor de la superclase abstracta con argumentos? –

0

clase abstracta representa un nivel más superior de los objetos, en algunos casos estos principales objetos de nivel necesita valores que se fijan en la creación del objeto por el punto de vista comercial. Faltar para establecer este valor podría causar que el objeto comercial falle. Los constructores se admiten en la clase abstracta para imponer un valor al construir la clase (de lo contrario, podría olvidarse). Por ejemplo,

public abstract class AccountHolder 
{ 
} 

    public abstract class Account 
    { 
     private AccountHolder holder; 

    public Account(AccountHolder holder) 
    { 
    this.holder = holder; 
    } 
    } 

    public class FixedDeposit extends Account 
    { 
    public FixedDeposit (AccountHolder holder) 
    { 
    super(holder) 
    } 
    } 

Aquí no podemos imaginar una cuenta sin un soporte, por lo que es esencial para el negocio para configurar el soporte al crear el objeto. Al establecerlo en el nivel base, se garantiza que se forzará para establecer al agregar nuevos tipos de subclases. Por lo tanto, es para garantizar 'Abierto para extensiones pero cerrado para modificación' uno de los principios SÓLIDOS.

0

Los constructores en las clases base se pueden utilizar para hacer el encadenamiento de constructores, por lo que puede iniciar los campos de su clase base, por ejemplo. En este constructor se puede poner un poco de BusinessLogic para validar los parámetros

ejemplo contructor chainging:

public abstract class Person 
{ 
    protected readonly string Name; 

    protected Person(string name) 
    { 
     //Do some validations or regex on the name for example so you know all person names match your business rules 
     Name = name; 
    } 
} 

public class Employee : Person 
{ 
    private decimal _salary; 

    public Employee(string name, decimal salary) 
     : base(name) 
    { 
     _salary = salary; 
    } 
} 
Cuestiones relacionadas