2013-09-10 3 views
0
public class LawClient extends Client 
{ 
    boolean defendant; 
    String caseTopic; 

     LawClient (String n, boolean d) 
    { 
     name = n; 
     defendant = d; 
    } 

     LawClient (String n, boolean d, String c, String e) 
    { 
     name = n; 
     defendant = d; 
     caseTopic = c; 
     email = e; 
    } 

    public String determineStatus() 
    { 
     if(caseTopic == null) 
     { 
      return "none"; 
     } 
     else 
     { 
     String s = ""; 
     s += "defendant: " + defendant +"\n" + "CaseTopic: " + caseTopic; 
     return s; 
     } 
    } 
} 

Я получаю 2 ошибки без всякой Sutable конструкторы для lawclient конструкторов, но не знаю, что я сделал не так и как это исправить.ошибка присвоения класса с абстрактным полиморфизмом и наследованием

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

abstract class Client 
{ 
    protected String name; 
    protected double balance; 
    protected String email; 

    Client (String n) 
    { 
     name = n; 
    } 

    Client (String n, String e) 
    { 
     name = n; 
     email = e; 
    } 


    public String getName() 
    { 
     return name; 
    } 

    public double getBalance() 
    { 
     return balance; 
    } 

    public String getEmail() 
    { 
     return email; 
    } 

    public String setName(String a) 
    { 
     name = a; 
     return name; 
    } 

    public double adjustBalance(double b) 
    { 
     balance = b; 
     return balance; 
    } 

    public String setEmail(String e) 
    { 
     email = e; 
     return email; 
    } 

    public abstract String determineStatus(); 

    public String toString() 
    { 
     String a = ""; 
     a += "name: " +name + ("\n")+"Balance: " +balance + ("\n")+"Email: " +email + ("\n"); 
     return a; 
    } 
} 
+0

Следует ли строителям публиковать? – Taylor

+0

да спасибо, я пропустил это, но он не разрешает проблему – user2744515

+0

показать код с ошибкой pls. EDIT: поцарапать это. Просто прочитайте, что ваша ошибка принадлежит самим конструкторам. Конструкторы должны ссылаться на явный конструктор в клиенте, а для клиента - конструктор no-arg. – Taylor

ответ

5

Проблема в том, как конструкторы работают в Java для унаследованных классов. Если вы не укажете вызов конструктора родительского класса, Java автоматически добавит метод super() в начало конструктора.

Для следующего конструктора LawClient:

LawClient (String n, boolean d) 
{ 
    name = n; 
    defendant = d; 
} 

Java делает вызов супер() перед попыткой присвоить п назвать, но не конструктор, который соответствует в классе Client.

Если вы не добавите нет-арг конструктор класса Client все должно работать:

Client() { 
    //no-args 
} 

В качестве альтернативы, вы можете назвать правильный конструктор супер-класса внутри конструктора LawClient, как так:

LawClient (String n, boolean d) 
{ 
    super(n); // this will call the first constructor of the Client class 
    name = n; 
    defendant = d; 
} 
+1

Альтернатива лучше, чем создание конструктора по умолчанию в 'Client'. Он сохраняет инкапсуляцию и не нарушает [DRY] (http://en.wikipedia.org/wiki/Don't_repeat_yourself). –

1

Просто вызовите конструктор клиента на обоих LawClient конструкторами с соответствующими аргументами супер()

Например

LawClient (String n, boolean d) 
{ 
    super(n); 
    defendant = d; 
} 

LawClient (String n, boolean d, String c, String e) 
{ 
    super(n, e); 
    defendant = d; 
    caseTopic = c; 
} 
+3

Вызов 'super()' должен быть первым в конструкторе. –

1

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

Решения переписать конструкторы вашего LawClient класса вызывать соответствующий суперкласс конструктора:

LawClient (String n, boolean d) 
{ 
    super(n); 
    defendant = d; 
} 

LawClient (String n, boolean d, String c, String e) 
{ 
    super(n, e); 
    defendant = d; 
    caseTopic = c; 
} 

Альтернативы будет явно определить конструктор по умолчанию для Client. Ваш текущий код будет работать, но это будет нарушать как инкапсуляцию (поскольку вы будете инициализировать поля Client из конструктора подкласса), а также DRY principle.

0

Для всех классов требуется конструктор. Первая строка любого конструктора должна быть вызовом конструктора родительского класса.

Чтобы быть полезным Java создает пустой конструктор по умолчанию, только если вы не указали, и это также создает вызов конструктора родительского класса по умолчанию, если вы не укажете вызов так

class Parent{ 
} 

class Child extends Parent{ 
} 

точно так же, как

class Parent{ 
    public Parent(){ 
     super(); 
    } 
} 

class Child extends Parent{ 
    public Child(){ 
     super(); 
    } 
} 

, что ваш код пытается сделать

public class LawClient extends Client 
{ 
    .... 
    LawClient (String n, boolean d) 
    { 
     super(); 
     name = n; 
     defendant = d; 
    } 

    LawClient (String n, boolean d, String c, String e) 
    { 
     super(); 
     name = n; 
     defendant = d; 
     caseTopic = c; 
     email = e; 
    } 

, который не работает как

Client(){ 
} 

нет.

так что вам нужно указать конструктор без аргументов или вызвать конструктор specf в каждом из конструкторов LawClient.

0

Я вижу две вещи:

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

  2. Проверьте видимость своих классов и конструкторов. Они не все public. Если модификатор отсутствует, он отображается только из одного пакета.

Смежные вопросы