Java: расширение класса, конструктор подкласса дает ошибку

Немного предыстории:

Участвуют три класса: Tester(main method), DNASequence(object) и ProteinDNA(subclass of DNASequence). Все три в одном пакете.

Конструктор для ProteinDNA принимает объект DNASequence и целое число

public class ProteinDNA extends DNASequence{
public ProteinDNA(DNASequence dna, int startAt){   //this is the constructor

Компиляция класса ProteinDNA дает мне ошибку в конструкторе.

Ошибка в Eclipse:

"Implicit super constructor `DNASequence()` is undefined.
 Must explicitly invoke another constructor"

Ошибка в jGrasp:

ProteinDNA.java:16: error: 
   constructor DNASequence in class DNASequence cannot be applied to given types;
public ProteinDNA(DNASequence dna, int startAt)^{


     required: String

     found: no arguments

     reason: actual and formal argument lists differ in length"

Что я делаю неправильно? Класс Tester передает ProteinDNA правильно сконструированный экземпляр DNASequence.


person sharingan    schedule 16.10.2013    source источник
comment
ProteinDNA является DNASequence, поэтому вам нужно явно вызвать конструктор DNASequence, так как он не имеет конструктора без аргументов.   -  person Sotirios Delimanolis    schedule 16.10.2013
comment
Вы найдете ответ в stackoverflow.com/questions/9143317/   -  person Kojotak    schedule 16.10.2013
comment
Создание конструктора без аргументов в DNASequence устраняет проблему! Спасибо!   -  person sharingan    schedule 16.10.2013
comment
@ user1766889: Ну, это исправит ошибку времени компиляции, но на самом деле это может не делать то, что вы хотите. Вы уверены, что ProteinDNA должен расширять DNASequence? Кажется странным, что он принимает один в своем конструкторе и расширяет его...   -  person Jon Skeet    schedule 16.10.2013
comment
Это не так уж странно, потому что второй аргумент — это int, который является индексом DNASequence. Итак, ProteinSequence — это только часть класса DNASequence. Я не копирую весь экземпляр суперкласса в экземпляр подкласса.   -  person sharingan    schedule 16.10.2013


Ответы (2)


Parent Class DNASequence has existing constructor with parameters. There 2 solutions for this.

1) Вы можете добавить конструктор по умолчанию без аргументов в класс последовательности ДНК.

2) Измените конструктор дочернего класса, чтобы вызвать конструктор родительского класса, как показано ниже,

    public ProteinDNA(DNASequence dna, int startAt){

   super(....); // This should be the 1st line in constructor code, add parameters 
                as per parent constructor 
}
person Dark Knight    schedule 16.10.2013

Похоже, вы пытаетесь передать объект DNASequence, и что происходит сбой при построении этого объекта.

требуется: String
найдено: нет аргументов

Это заставляет меня думать, что вы, вероятно, пытаетесь сделать что-то вроде следующего:

new ProteinDNA(new DNASequence(), num);

И компилятор говорит, что вместо этого он ожидает String:

new ProteinDNA(new DNASequence("SOME STRING"), num);

Имеет ли это смысл?

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

  • Вызов конструктора ProteinDNA
  • Сигнатуры конструкторов DNASequence
  • Код метода тестирования

Кроме того, можете ли вы пояснить, почему, если ProteinDNA является подклассом DNASequence, вы передаете DNASequence его конструктору? Это какая-то защитная копия?

Кроме того, как упоминалось в альтернативном ответе, вы можете добавить вызов суперконструктора (DNASequence(String)) в дочерний конструктор в качестве первой строки, например:

super("SOME STRING")

Но это действительно зависит от вашей логики...

person mdm    schedule 16.10.2013