2016-08-12 8 views
0

Ниже приведена логика ниже: все три класса AppleLeaf, MangoLeaf и BananaLeaf расширяются. Класс листа. У меня есть метод, который принимает только листовой объект. Он должен перенаправить меня к приведенным ниже методам на основе типа класса. Но я получаю ошибку, как, «Метод handleLeaf (AppleLeaf) в типе главного не применяется для аргументов (листья)»Чтобы перегрузить метод, принимающий базовый класс и направляющий реализацию метода расширяющихся классов

public void main(String args[]){ 

     for (Leaf leaf : leafList) { 
     handleLeaf(leaf);  
    } 
} 

private void handleLeaf(AppleLeaf node) { 
    String colour = leaf.getColour(); 
    System.print.out(colour); 
} 

private void handleLeaf(MangoLeaf mLeaf) { 
    Int veins = mLeaf.getVeinCount; 
    System.print.out(veins); 
} 

private void handleLeaf(BananaLeaf bLeaf) {  
    Boolean withered = bLeaf.getTexture(); 
} 
+2

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

ответ

1

Это не совсем так, как это работает. Вы определили три метода, ни один из которых не принимает Leaf в качестве параметра. Каждый из них занимает подкласс Leaf, но мы не знаем, какой подкласс Leaf может иметь данный аргумент.

Один из способов, чтобы сделать метод делегирования, такие как:

private void handleLeaf(Leaf leaf) { 
    if(leaf instanceof AppleLeaf) 
     handleLeaf((AppleLeaf)leaf); 
    else if(leaf instanceof MangoLeaf) 
     handleLeaf((MangoLeaf)leaf); 
    ...//And so on 
} 

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

+0

есть ** рукояткаLeaf ((AppleLeaf) лист); ** такой же как ** рукояткаLeaf (AppleLeaf лист); **? Я имею в виду, нужно ли мне писать другую реализацию для метода taht? – yellow

+0

@yellow \t Вам не хватает точки наследования Java. Суперкласс не должен нести ответственность за определение подкласса и передачу его одному из своих собственных методов на основе подкласса. Каждый подкласс должен иметь функцию обработчика, и суперкласс должен это назвать. Суперкласс должен либо реализовать метод, либо заставить его генерировать исключение, поэтому, если подкласс забывает реализовать его обработчик, это ошибка или объявить его абстрактным методом (что означает, что вы не можете создать экземпляр суперкласса). –

+0

@yellow \t И нет, это не то же самое, что последний не будет компилироваться. Этот код проверяет реализацию «Листа» и отбрасывает каждый экземпляр «Лист» соответствующему типу. Но это плохой подход практически во всех обстоятельствах. –

0

Вы не можете автоматически базовому типу, как это. То, что вы ищете, - это привязка динамического метода, которого нет в Java. Java - это связанный с compiletime язык, и, следовательно, он не будет компилироваться/запускаться.

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

  • Нет связанных вопросов^_^