Вызов дочернего метода при приведении к родительскому типу в Java - PullRequest
3 голосов
/ 21 ноября 2011

У меня проблемы с какой-то курсовой работой, которую я пытаюсь завершить, и любая помощь будет признательна!

У меня есть 3 типа учетных записей, которые расширяют абстрактный тип "Учетная запись" .. [CurrentAccount,StaffAccount и MortgageAccount].

Я пытаюсь прочитать некоторые данные из файла и создать объекты учетной записи вместе с объектами пользователя, чтобы добавить их в хеш-таблицы, хранящиеся в программе.

При создании объектов учетной записи яиспользуйте временную переменную типа Account и определите ее подтип в зависимости от считываемых данных.

, например:

Account temp=null;

if(data[i].equalsIgnoreCase("mortgage"){
    temp= new MortgageAccount;
}

Проблема в том, что я пытаюсь вызвать метод, принадлежащий типу MortgageAccount..

Нужна ли мне временная переменная каждого типа StaffAccount MortgageAccount и CurrentAccount и использовать их для того, чтобы использовать их методы?

Заранее спасибо!

Ответы [ 4 ]

7 голосов
/ 21 ноября 2011

Это зависит.Если родительский класс Account имеет метод, переопределенный в MortgageAccount, то при вызове метода вы получите версию MortgageAccount.Если метод существует только в MortgageAccount, то вам нужно привести переменную для вызова метода.

6 голосов
/ 21 ноября 2011

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

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

class A{
    public void sayHi(){ "Hi from A"; }
}


class B extends A{
    public void sayHi(){ "Hi from B"; 
    public void sayGoodBye(){ "Bye from B"; }
}


main(){
  A a = new B();

  //Works because the sayHi() method is declared in A and overridden in B. In this case
  //the B version will execute, but it can be called even if the variable is declared to
  //be type 'A' because sayHi() is part of type A's API and all subTypes will have
  //that method
  a.sayHi(); 

  //Compile error because 'a' is declared to be of type 'A' which doesn't have the
  //sayGoodBye method as part of its API
  a.sayGoodBye(); 

  // Works as long as the object pointed to by the a variable is an instanceof B. This is
  // because the cast explicitly tells the compiler it is a 'B' instance
  ((B)a).sayGoodBye();

}
4 голосов
/ 21 ноября 2011

Это концепция Dynamic method dispatch

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

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

4 голосов
/ 21 ноября 2011

Все, что вам нужно, это объект типа MortgageAccount для вызова методов на нем.Ваш объект temp имеет тип MortgageAccount, поэтому вы можете просто вызывать методы MortageAccount и Account для этого объекта.Кастинг не требуется.

...