¿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?
Respuesta
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".
awesome play – developer
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();
}
}
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. ;)
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.
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);
}
}
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.
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");
se puede explicar más claramente – developer
+1 para el claro ejemplo –
@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? –
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.
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;
}
}
- 1. ¿Por qué las clases abstractas en Java tienen constructores?
- 2. Grandes clases base abstractas
- 3. Interfaces vs. clases abstractas
- 4. Clases abstractas en relaciones GORM
- 5. ¿Múltiples clases abstractas derivadas?
- 6. AS3 - clases abstractas
- 7. Clases selladas abstractas
- 8. JAXB y clases abstractas
- 9. ¿Cuál es la utilidad de los constructores públicos en clases abstractas en C#?
- 10. Cómo crear propiedades abstractas en las clases abstractas de Python
- 11. ¿Cuál es el caso de uso de constructores secundarios en clases abstractas?
- 12. ¿Por qué deberían los constructores de clases abstractas estar protegidos, no públicos?
- 13. Pruebas unitarias Clases abstractas en Groovy
- 14. Uso de los genéricos en clases abstractas
- 15. C# Propiedades en clases base abstractas
- 16. Alternativas a clases abstractas en Ruby?
- 17. ¿Las clases abstractas pueden implementarse en C#?
- 18. declaraciones de clases abstractas en C++
- 19. Java: variables finales en las clases abstractas
- 20. ¿Es pitónico utilizar interfaces/clases base abstractas?
- 21. mvc3 razor editortemplate con clases abstractas
- 22. Cómo probar las clases abstractas de unidad
- 23. C#: ¿Las clases abstractas necesitan implementar interfaces?
- 24. Usando Mockito para probar clases abstractas
- 25. Pruebas unitarias clases abstractas y/o interfaces
- 26. .net Herencia múltiple de las clases abstractas
- 27. Registro de Java con clases abstractas
- 28. Clases abstractas y Spring MVC @ ModelAttribute/@ RequestParam
- 29. Uso de WCF con clases abstractas
- 30. Herencia ambigua de clases base abstractas:
razón por la generosidad? –
@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