publicclassACSubClassextendsBaseClass { publicASubClass(String someString) { super(someString); } public String getName() { return"name value for ASubClass"; } }
У меня будет довольно много подклассов BaseClass, каждый из которых реализует getName() метод по-своему (шаблон метода шаблона).
Это работает хорошо, но мне не нравится наличие избыточного конструктора в подклассах. Его больше вводить, и его сложно поддерживать. Если бы я должен был изменить сигнатуру метода BaseClass конструктора, мне пришлось бы изменить все подклассы.
Когда я удаляю конструктор из подклассов, я получаю эту ошибку во время компиляции:
Implicit super constructor BaseClass() is undefined for default constructor. Must define an explicit constructor
Возможно ли то, что я пытаюсь сделать?
Переведено автоматически
Ответ 1
Вы получаете эту ошибку, потому что класс, у которого нет конструктора, имеет конструктор по умолчанию, который не содержит аргументов и эквивалентен следующему коду:
publicACSubClass() { super(); }
Однако, поскольку ваш базовый класс объявляет конструктор (и, следовательно, не имеет конструктора без аргументов по умолчанию, который в противном случае предоставил бы компилятор), это незаконно - класс, расширяющий базовый класс, не может быть вызван super(); потому что в BaseClass нет конструктора без аргументов.
Это, вероятно, немного нелогично, потому что вы можете подумать, что подкласс автоматически имеет любой конструктор, который есть у базового класса.
Самый простой способ обойти это - для базового класса не объявлять конструктор (и, следовательно, иметь конструктор без аргументов по умолчанию) или иметь объявленный конструктор без аргументов (либо сам по себе, либо вместе с любыми другими конструкторами). Но часто этот подход не может быть применен - потому что вам нужны любые аргументы, передаваемые в конструктор, чтобы создать законный экземпляр класса.
Ответ 2
Для тех, кто ищет в Google эту ошибку и попадает сюда: для ее получения может быть другая причина. Eclipse выдает эту ошибку, когда у вас есть несоответствие настройки проекта - конфигурации системы.
Например, если вы импортируете проект Java 1.7 в Eclipse и у вас неправильно настроен 1.7, вы получите эту ошибку. Затем вы можете либо перейти к Project - Preference - Java - Compiler и switch to 1.6 or earlier; или перейти к Window - Preferences - Java - Installed JREs и добавить / исправить вашу установку JRE 1.7.
Ответ 3
Это возможно, но не так, как у вас есть.
Вы должны добавить конструктор без аргументов в базовый класс, и все!
Если бы я должен был изменить сигнатуру метода конструктора базового класса, мне пришлось бы изменить все подклассы.
Что ж, вот почему наследование - это артефакт, создающий ВЫСОКУЮ связь, что нежелательно в OO-системах. Его следует избегать и, возможно, заменить композицией.
Подумайте, действительно ли они вам нужны как подкласс. Вот почему вы видите, что очень часто интерфейсы используются вместо:
publicinterfaceNameAware { public String getName(); }
classAimplementsNameAware ... classBimplementsNameAware ... classC ... etc.
Здесь B и C могли быть унаследованы от A, что создало бы очень ВЫСОКУЮ связь между ними, при использовании интерфейсов связь уменьшается, если A решит, что это больше не будет "NameAware", другие классы не сломаются.
Конечно, если вы хотите повторно использовать поведение, это не сработает.
Ответ 4
Вы также можете получить эту ошибку, когда JRE не установлен. Если это так, попробуйте добавить системную библиотеку JRE в свой проект.
В Eclipse IDE:
откройте меню Проект --> Свойства или щелкните правой кнопкой мыши на вашем проекте в Проводнике пакетов и выберите Свойства (Alt + Enter в Windows, Command + I на Mac)
нажмите на путь сборки Java, затем на вкладку Библиотеки
выберите Путь к модулю или Путь к классу и нажмите Добавить библиотеку ... кнопка
выберите системную библиотеку JRE затем нажмите Далее
выберите Workspace default JRE (вы также можете выбрать другой вариант) и нажмите Готово