Скрытие методов с параметром подкласса - PullRequest
1 голос
/ 25 августа 2011

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

public class Animal {

  /* constructor */
  Animal () { }

  /* instance method */
  void add(Number n) {
    System.out.println("An animal added a number!");
  }

  /* Main method */
  public static void main(String[] args) {
    Integer i = 2;   // Integer i = new Integer(2);
    Double d = 3.14; // Double d = new Double(3.14);

    Animal mammal = new Animal();
    Cat tom = new Cat();
    Mouse jerry = new Mouse();

    mammal.add(i); // produces "An animal added a number!"
    mammal.add(d); // produces "An animal added a number!"

    tom.add(i);    // produces "Tom added an integer!"
    tom.add(d);    // produces "An animal added a number!"

    jerry.add(i);  // produces "An animal added a number!"
    jerry.add(d);  // produces "Jerry added a double!"
  }
}

class Cat extends Animal {

  /* constructor */
  Cat () { }

  /* instance method */
  void add(Integer i) {
    // param of type Integer extends Number
    System.out.println("Tom added an integer!");
  }
}

class Mouse extends Animal {

  /* constructor */
  Mouse () { }

  /* instance method */
  void add(Double d) {
    // param of type Double extends Number
    System.out.println("Jerry added a double!");
  }
}

EDIT:

Благодаря @MByD выяснилось, что это называется «перегрузкой метода».

Новый вопрос, связанный с выше: В классе Animal я хочу создать метод, который принимает объект Number и использует один из перегруженных методов add() в подклассах Cat и Mouse. Есть ли лучший способ сделать это, чем показано ниже?

public class Animal {
...
  void subtract(Number n) {
    if      (n instanceof Integer) this.add(-(Integer) n); // from the Cat class
    else if (n instanceof Double)  this.add(-(Double) n);  // from the Mouse class
    ...
  }
...
}

Да, я понимаю, что мог бы просто написать this.add(-n), но мне интересно, есть ли способ выбрать реализацию, зависящую от подкласса параметра. Поскольку параметр является абстрактным типом и не может быть создан, I должен передать подкласс в качестве аргумента.

1 Ответ

3 голосов
/ 25 августа 2011

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

См. Учебники Java по методам :

Язык программирования Java поддерживает методы перегрузки и Java Можно различать методы с разными сигнатурами методов. это означает, что методы внутри класса могут иметь одинаковое имя, если они имеют различные списки параметров (к этому будет обсуждаться в уроке под названием «Интерфейсы и наследование»).

Аргумент, использовать ли и когда все виды перегрузки / переопределения / затенения и т. Д., Является большим. Очень хорошим источником является книга Effective Java , Джошуа Блох. Что я нашел очень полезным и интересным.

...