2015-03-03 3 views
1

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

public abstract class A{ 
    public abstract A(); 
} 

Если бы мы могли принудительно реализовать конструкторы, мы могли бы создавать абстрактные классы. Но почему они? Нарушает ли это проект ООП, или это просто невозможно?

+0

Что бы это значило? Заставить всех наследников реализовать открытый конструктор без параметров? Для чего? –

+0

посетите http://stackoverflow.com/questions/9477476/why-constructors-cannot-be-final – Nooh

+0

@lc. поэтому вы можете оставить реализацию конструктора конкретными классами, а не абстрактными. Просто назовите конструктор абзаца в коде и оставьте логику реализации. – armin

ответ

3

Абстрактного конструктора не имеет смысла.

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

Однако конкретный подкласс не может реализовать конструктор с тем же именем, что и «абстрактный конструктор» абстрактного класса, поскольку конструктор должен иметь имя класса, в котором он появляется.

+0

это просто дизайн choice.java разработчики могли бы легко создать синтаксис, чтобы разрешить это. Но почему они не позволили, это полный другой вопрос. Пример синтаксиса для выполнения этого является публичным абстрактным this(); для конструктора. – armin

0

У вас не может быть абстрактного конструктора, поскольку абстрактное означает, что вам необходимо обеспечить реализацию для этого в некоторый момент времени в вашем подклассе. Но вы не можете переопределить конструктор. Не будет смысла иметь абстрактный конструктор:

  1. Поскольку конструктор должен иметь то же имя, что и у класса.
  2. Вы всегда будете вызывать конструктор дочернего класса, а не базы класса

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

Но если вы все еще хотите применять этот вид шаблона, вам нужно пойти с рисунком абстрактные фабрики

+0

, так как это просто вопрос дизайна, мы могли бы просто определить конструктор как этот публичный аннотация this() или что-то в этом роде. Мы могли бы использовать любую структуру. Я хотел знать, почему ваш ответ покрыл некоторые из них. – armin

0

Абстрактный модификатор предназначен для тех, реализация которых еще не дано.

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

Почему

Для класса существует его конструктор по умолчанию будет вызываться в системе автоматически. Но теперь, когда вы предоставили свой собственный конструктор (который дополнительно является абстрактным), по умолчанию он не будет существовать и, следовательно, этот класс не будет существовать.

Следовательно непоследовательная ситуация быть.

Надеется, что это помогает.

0

При установке конструктор как «абстрактное», вы, по сути говоря:

Этот конструктор не имеет тела, и вы хотите реализовать его в другое время в дочернем классе

Однако конструктор называется неявным, когда объект создан, поэтому мы не можем реализовать конструктор, поэтому конструкторы не абстрактны.

abstract class BaseClass { 
    abstract BaseClass() // compile time error 
}