Приведение к интерфейсу объект не унаследовал - PullRequest
0 голосов
/ 22 марта 2020

Пример из реального мира

Летучие мыши, птицы, стрекозы и люди способны летать, но развили способность делать это независимо благодаря конвергентной эволюции .

Применяется к Java

Bat, Bird, Dragonfly и Human - все реализуют функцию .fly(), но не наследуют ее от общего класса , Мне нужна функция, которая принимает Organism, не зная, является ли Bat, Bird, Dragonfly или Human, но зная, что она имеет функцию .fly().

Текущее решение

public flyBaby(Bat organism){
 organism.fly();
}
public flyBaby(Dragonfly organism){
 organism.fly();
}
public flyBaby(Bird organism){
 organism.fly();
}
public flyBaby(Human organism){
 organism.fly();
}

Неудачные попытки

public <T> void flyBaby(T organism){
 organism.fly();
}
public void run(){
 Bat fred = new Bat();
 fred.infect("corona_virus");
 flyBaby(fred);
}

или подобные

public void flyBaby(Flyable organism){
 organism.fly();
}
public void run(){
 Bat fred = new Bat();
 fred.infect("corona_virus");
 flyBaby((Flyable)fred);
}

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Механизм объявления общих методов без наследования называется интерфейсом. Интерфейсы - это особые типы определений классов, которые (обычно) содержат только определения методов.

Ваша попытка использовать тип "Flyable" должна работать до тех пор, пока

  • Flyable - это интерфейс
  • все классы организмов "реализуют" этот интерфейс

Что-то вроде

public interface Flyable {
    public void fly();
}
public class Bat implements Flyable {
    ...
}

public void flyBaby(Flyable organism){
 organism.fly();
}
public void run(){
 Bat fred = new Bat();
 flyBaby(fred);
}
0 голосов
/ 22 марта 2020

Как сказал VGR в комментарии, вам нужно

  1. написать интерфейс (Flyable);
  2. заставить ваши классы реализовать его;
  3. написать класс (FlyClass) с внедренным в него методом stati c (flyable f); и
  4. и позвоните, чтобы летать в main (): FlyClass.fly (new Human () | new Bat | et c.).

Создание интерфейса и Реализация одного и того же метода в каждом классе будет проще.

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