Подтвердить что ты не робот

Конструкторы в абстрактных классах?

Почему абстрактный класс может иметь конструктор? Поскольку мы не можем создать объект, почему нам нужен конструктор в абстрактном классе?

4b9b3361

Ответ 1

В некоторых случаях нам нужно инициализировать поля в абстрактном классе. Если это пустой конструктор, это делается неявным конструктором в дочернем классе, в противном случае мы используем super(parameters). Конструктор с параметрами заставляет дочерний класс указывать некоторые параметры (не обязательно из его собственных параметров).

В общем, это означает, что конструктор используется конструктором дочернего класса, а не "внешним".

Ответ 2

Добавляя конструктор в абстрактный класс, вы можете заставить дочерние классы сделать вызов super, чтобы инициализировать некоторые поля. Пример:


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");

Ответ 3

Вам все равно нужно создать подкласс, который должен вызвать его родительский конструктор и его родителей и т.д.

Реальный вопрос - почему вы можете публиковать конструктор абстрактных классов.;)

Ответ 4

потому что класс, который наследует ваш класс abstact, может вызвать этот конструктор

abstract class Foo {

    private int number;

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

class Bar extends Foo {

    public Bar() {
        super(1);
    }

}

Ответ 5

Подклассы могут быть созданы и могут вызывать конструктор абстрактного класса из его конструктора. Пример:

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

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

Ответ 6

Подумайте об абстрактном классе, таком как проект производного до 1 или 2 метода, который должен быть реализован в производных классах. Имеет смысл реализовать максимально возможное/разумное в абстрактном классе, включая конструктор.

Ответ 7

Абстрактный конструктор заставляет классы, которые наследуют от класса для реализации (или вызова) конструктора. Это означает, что вы можете быть уверены, что будут выполняться любые операции в конструкторе абстрактного класса.

Ответ 8

Абстрактный класс представляет собой более высокий уровень объектов, в некоторых случаях эти объекты верхнего уровня нуждаются в значениях, которые должны быть установлены при создании объекта с точки зрения бизнеса. Отсутствие этого значения может привести к сбою бизнес-объекта. Конструкторы поддерживаются в абстрактном классе, чтобы обеспечить установку значения при построении класса (в противном случае его можно было бы забыть). Например,

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)
    }
    }

Здесь мы не можем представить учетную запись без владельца, поэтому важно, чтобы бизнес установил держатель при создании объекта. Установив его на базовом уровне, он будет вынужден устанавливать при добавлении новых типов подклассов. Следовательно, для обеспечения "Open для расширений, но закрытых для модификации" один из принципов SOLID.

Ответ 9

Конструкторы в базовых классах могут использоваться для цепочки конструкторов, поэтому вы можете, например, инициализировать свои поля базового класса. В этом конструкторе вы можете поместить некоторый businesslogic для проверки параметров

пример 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;
    }
}