2010-04-25 4 views
1

У меня возникли проблемы с назначением hw. В одном задании нам пришлось создать класс Person. Шахта была:Конструкторы расширенного класса в Java

public class Person 
{ 
    String firstName; 
    String lastName; 
    String telephone; 
    String email; 

    public Person() 
    { 
     firstName = ""; 
     lastName = ""; 
     telephone = ""; 
     email = ""; 
    } 

    public Person(String firstName) 
    { 
     this.firstName = firstName; 
    } 

    public Person(String firstName, String lastName, String telephone, String email) 
    { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.telephone = telephone; 
     this.email = email; 
    } 

    public String getFirstName() 
    { 
     return firstName; 
    } 

    public void setFirstName(String firstName) 
    { 
     this.firstName = firstName; 
    } 

    public String getLastName() 
    { 
     return lastName; 
    } 

    public void setLastName(String lastName) 
    { 
     this.lastName = lastName; 
    } 

    public String getTelephone() 
    { 
     return telephone; 
    } 

    public void setTelephone(String telephone) 
    { 
     this.telephone = telephone; 
    } 

    public String getEmail() 
    { 
     return email; 
    } 

    public void setEmail(String email) 
    { 
     this.email = email; 
    } 

    public boolean equals(Object otherObject) 
    { 
     // a quick test to see if the objects are identical 
     if (this == otherObject) { 
      return true; 
     } 

     // must return false if the explicit parameter is null 
     if (otherObject == null) { 
      return false; 
     } 

     if (!(otherObject instanceof Person)) { 
      return false; 
     } 

     Person other = (Person) otherObject; 
     return firstName.equals(other.firstName) && lastName.equals(other.lastName) && 
      telephone.equals(other.telephone) && email.equals(other.email); 
    } 

    public int hashCode() 
    { 
     return 7 * firstName.hashCode() + 
      11 * lastName.hashCode() + 
      13 * telephone.hashCode() + 
      15 * email.hashCode(); 
    } 

    public String toString() 
    { 
     return getClass().getName() + "[firstName = " + firstName + '\n' 
            + "lastName = " + lastName + '\n' 
            + "telephone = " + telephone + '\n' 
            + "email = " + email + "]"; 
    } 
} 

Теперь мы должны создать класс Loan, который использует Person в качестве атрибута, а затем продлить этот класс Loan. Мой класс Кредит:

public abstract class Loan 
{ 
    public void setLoanId(int nextId) 
    { 
     loanId = nextId; 
     nextId++; 
    } 

    public int getLoanId() 
    { 
     return loanId; 
    } 

    public void setInterestRate(double interestRate) 
    { 
     this.interestRate = interestRate; 
    } 

    public double getInterestRate() 
    { 
     return interestRate; 
    } 

    public void setLoanLength(int loanLength) 
    { 
     this.loanLength = loanLength; 
    } 

    public int getLoanLength() 
    { 
     return loanLength; 
    } 

    public void setLoanAmount(double loanAmount) 
    { 
     this.loanAmount = loanAmount; 
    } 

    public double getLoanAmount(double loanAmount) 
    { 
     return loanAmount; 
    } 

    public void printPayments() 
    { 
     double monthlyInterest; 
     double monthlyPrincipalPaid; 
     double newPrincipal; 
     int paymentNumber = 1; 
     double monthlyInterestRate = interestRate/1200; 
     double monthlyPayment = loanAmount * (monthlyInterestRate)/
           (1 - Math.pow((1 + monthlyInterestRate),(-1 * loanLength))); 

     // amortization table 
     while (loanAmount != 0) { 
      monthlyInterest = loanAmount * monthlyInterestRate; 
      monthlyPrincipalPaid = monthlyPayment - monthlyInterest; 
      newPrincipal = loanAmount - monthlyPrincipalPaid; 
      loanAmount = newPrincipal; 

      System.out.println("Payment Number | Interest | Principal | Loan Balance"); 
      System.out.printf("%d, %.2f, %f, %f", paymentNumber++, monthlyInterest, newPrincipal, loanAmount); 
     } 
    } 
    /* 
    //method to print first payment 
    public double getFirstPayment() 
    { 
    } 

    method to print last payment 
    public double getLastPayment() 
    { 
    }*/ 

    private Person client; 
    private int loanId; 
    private double interestRate; 
    private int loanLength; 
    private double loanAmount; 
    private static int nextId = 1; 

} 

А потом продлил класс Loan с классом CarLoan, есть функция прототип:

public CarLoan(Person client, double vehiclePrice, double downPayment, double salesTax, 
        double interestRate, CAR_LOAN_TERMS length) 

Я запутался, как я использую конструктор Person из суперкласса , Я не могу делать

super(client); 

в моем конструкторе, что и сделала книга с некоторыми примитивными типами в их примере. Не уверен, что правильная вещь ... Любые мысли? Благодаря!

+1

Распространяется ли класс CarLoan Person? – Finbarr

+0

Извините, кредит распространяется на человека, и Карлоан продлевает кредит – Crystal

ответ

3

CarLoan не должен продлевать лицо. Это не имеет никакого смысла, поскольку CarLoan не может быть Лицом.

Но человек может быть переменной класса в классе CarLoan.

public class CarLoan { 

    private Person client; 
    private double vehiclePrice; 

    public CarLoan(Person client, double vehiclePrice, double downPayment, double salesTax, double interestRate, CAR_LOAN_TERMS length) { 

    this.client = client; 
    this.vehiclePrice = vehiclePrice; 
    .. 
    } 
} 
+0

Я думаю, что клиент должен быть защищенным членом Кредита. – NomeN

+0

@NomeN: Если клиент был объявлен в Займе, он должен быть защищен. Но это не добавляет никакой ценности в этом случае, когда класс не выходит из CarLoan. – Espen

+0

ОП упоминает в своем посте, что Человек должен быть атрибутом займа, т.е. должно быть поле типа Person in Loan. Поскольку вам необходим доступ к этому полю из CarLoan для его установки, вам нужно либо получить/установить методы для этого поля, либо защитить его. – NomeN

0

Если CarLoan должен продлить Person, то Person станет суперклассом CarLoan.

Внутри конструктора CarLoan вы должны всегда вызывать один из конструкторов Person через ключевое слово super перед любой другой обработкой.

Однако мне кажется, что вы очень смущены, так как ваш прототип метода передает экземпляр Person в CarLoan. Кроме того, я не понимаю, почему класс, называемый CarLoan, будет распространять человека.

1

Похоже, вы хотите использовать composition вместо наследования.

В простом английском языке CarLoan имеет клиента (типа Person). Сам CarLoan не является Человеком (какое наследование предложило бы).

Итак, вы должны сделать то, что предлагает Эспен (состав), вместо CarLoan extends Person (наследование).

Возможного законное использование наследования будет:

class Waiter extends Person { 
    String employeeId; 

    // A waiter is a person with some extra information 
    public Waiter(String firstName, String lastName, String telephone, 
        String email, String employeeId) { 
     super(firstName, lastName, telephone, email); // must be first 
     this.employeeId = employeeId; 
    } 

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