Как остановить вызывающий метод объекта дочернего класса из родительского класса, несмотря на то, что тот же метод также находится в дочернем классе - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть объект типа ElectronicProduct, который расширяет Product, я пытаюсь вызвать метод loadFromFile () из дочернего класса, давая точное имя и тип аргумента, но вместо этого объект дочернего класса вызывает loadFromFile () из родительский класс. Как мне остановить это?

Код выглядит следующим образом:

ElectronicProduct eProduct = new ElectronicProduct();
eProduct.loadFromFile(eProduct,bin); 

однако он вызывает метод в родительском классе ниже:

public Product loadFromFile(Product aProduct, BufferedReader bin) throws IOException, ParseException{ 

   //some code 

}

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

public ElectronicProduct loadFromFile(Product aProduct, BufferedReader bin) throws IOException, ParseException{

// Some code

}

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

РЕДАКТИРОВАТЬ

Это очень странно, поскольку теперь он начал работать так, как я хотел, без каких-либо изменений. Другой сценарий, но похожая вещь произошла раньше, когда он выдает предупреждение об ошибке, я удаляю код и пишу ту же самую вещь, и тогда это работает. Я не хочу, чтобы это происходило случайным образом, так как это дифференцированное задание. Не хотите go отключить topi c, но это должно быть связано. Посоветуйте, пожалуйста, если кто-нибудь знает, что только что произошло?

EDIT * 2

В ответ на комментарий от Tiffado причина, по которой передается объект Product, а не объект ElectronicProduct, заключается в том, что в методе дочернего класса объект Product передается в родительский класс. Если я вместо этого передам объект дочернего класса в дочерний метод, который затем передает объект родительскому методу, он может не работать, так как я узнал, что родительские классы не «видят» дочерние классы. Пожалуйста, поправьте меня, если это неверно.

public ElectronicProduct loadFromFile(Product aProduct, BufferedReader bin) throws IOException, ParseException{


ElectronicProduct eProduct = new ElectronicProduct();

eProduct = (ElectronicProduct)super.loadFromFile(aProduct,bin);

eProduct.setGuarunteeDuration(Integer.valueOf(bin.readLine()));

return eProduct;

}

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Компилятор не может узнать разницу между вашими двумя методами: вам нужно указать другой порядок параметров в сигнатуре метода, количестве параметров, но никакие типы параметров подкласса или типы возврата подкласса не будут иметь значения:

Метод:

public Product loadFromFile(Product aProduct, BufferedReader bin) throws IOException, ParseException{ 

То же самое, что и

public ElectronicProduct loadFromFile(Product aProduct, BufferedReader bin) throws IOException, ParseException{

, поскольку тип возвращаемого значения (ElectronicProduct) является подклассом Product, поэтому он не является частью сигнатура метода для использования полиморфизма.

См. также: «Java сигнатуры метода принимают только имя метода, а также число и тип параметров», доступно по адресу: https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html

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

public class Product {

  static int productIdentifier = 0;
  static int electronicProductIdentifier = 0;

    public Product loadFromFile( Product aProduct ) {

    System.out.println("Call loadFromFile from Product");
        Product product = new Product();
        return product;

    }

  public Product ()  {
    System.out.println("Creating a Product with ID " + 
            ( ++ productIdentifier ) );
  }

}


public class ElectronicProduct extends Product {

    public ElectronicProduct loadFromFile( Product aProduct ) {

    System.out.println("Call loadFromFile from ElectronicProduct");
        ElectronicProduct eProduct = new ElectronicProduct();
    super.loadFromFile( eProduct ); // Hardcoded call to parent!
        return eProduct;

    }

  public ElectronicProduct ()  {
    System.out.println("Creating an ElectronicProduct with ID " + 
            ( ++ electronicProductIdentifier ) );
  }

}

Product p = new Product();
ElectronicProduct ep = new ElectronicProduct();
ep.loadFromFile( ep );

Вывод:

Creating a Product with ID 1
Creating a Product with ID 2
Creating an ElectronicProduct with ID 1
Call loadFromFile from ElectronicProduct
Creating a Product with ID 3
Creating an ElectronicProduct with ID 2
Call loadFromFile from Product
Creating a Product with ID 4

(есть вызов loadFromFile () из продукта, поскольку он явно вызывается из ElectronicProduct.loadFromFile ())

Если вы Вне линии, вызывающей super.loadFromFile(), вы не увидите звонка Product.loadFromFile():

Creating a Product with ID 1
Creating a Product with ID 2
Creating an ElectronicProduct with ID 1
Call loadFromFile from ElectronicProduct
Creating a Product with ID 3
Creating an ElectronicProduct with ID 2
0 голосов
/ 05 февраля 2020

Может быть, вам следует использовать такой метод:

public ElectronicProduct loadFromFile(ElectronicProduct aProduct, BufferedReader bin) throws IOException, ParseException{

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

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