2012-04-20 2 views
-1

если Fruit класса суперкласс и Apple и Orange являются подклассы фруктов, и GoldenDelicious и Macintosh являются суб классы Apple.наследование и полиморфизм конфликт

Предположим, что следующее объявление Дано:

Fruit fruit = new GoldenDelicious(); 
Orange orange = new Orange(); 

Ответ на этот вопрос с объяснить

Пусть метод makeAppleCider определяется в Apple классе. Может ли fruit вызывать этот метод? Может ли оранжевый вызвать этот метод ???

Мой ответ: Может ли использовать этот метод? Никаких указаний на то, что нет явного приведения в действие, необходимо сделать явное выражение для экземпляра фруктов , чтобы включить вызов метода, определенного в классе Apple. Доза этот ответ верен ????

+3

Это выглядит ужасно много, как домашнее задание. Это? – Jasper

+0

@Aidanc - в конце вопроса в предлагаемом решении предлагается предлагаемое решение. – Flexo

+0

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

ответ

0

A Fruit не имеет «знания» метода makeAppleCider. makeAppleCider определен в подклассе и не является членом Fruit. Класс имеет доступ только к методам, которые он или один из его родителей определяет. Учитывая класс определенного типа, вам нужно проследить резервную копию иерархии классов, чтобы узнать, какие методы вы можете получить. Вы можете думать о типе вашей переменной в качестве исходного места для ходьбы, поддерживая иерархию классов.

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

0

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

Вы могли бы, например, иметь интерфейс Сорта, как (не синтаксис проверено):

public interface CiderFruit { 
    public void makeCider(); 
} 

Затем компания Apple может реализовать интерфейс:

public class Apple extends Fruit implements CiderFruit { 
    .... 
    public void makeCider() { 
     doStuff(); 
    } 
    .... 
} 

Если вы тогда имели класс Айва он мог реализовать тот же интерфейс, и можно взять либо Apple, либо Quince, отбросить его на CiderFruit (если не уверены, это Apple или Quince) и вызвать makeCider(). (Можно также ссылаться непосредственно на ссылку, напечатанную как Apple или Quince.)

1

Это погружение в статические и динамические типы переменных.

Fruit fruit; 

Эта строка объявляет переменную fruit со статическим типом Fruit. Этот тип никогда не изменится (это все-таки статично), и это то, что вы обычно будете использовать.

fruit = new GoldenDelicious(); 

Эта линия является тот, который присваивает значение, которое является GoldenDelicious этой переменной. Динамический тип переменной изменяется, чтобы отразить это изменение. В конце концов, переменная на самом деле содержит GoldenDelicious.Динамический тип - это то, с чем вы обычно не работаете, но это то, что используется, когда вы используете (злой) instanceof (и он гарантирует, что перезаписанная функция вызывается в нужном месте).

Теперь, вы хотите сделать это:

fruit.makeAppleCider(); 

Это не будет работать. Из фруктов мы в основном знаем только статический тип, а статический тип Fruit ничего не знает об этом методе. (Тем не менее, за кулисами, если GoldenDelicious и Macintosh реализуют функцию по-разному, динамический тип будет вызывать правильную версию.)

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

В заключение, да, ваш ответ был верным.

(Да, мое описание немного техническое. Я надеюсь, что вы простите меня за то, что ...)

+0

Спасибо, и я уже простил вам :)) – MUE

+0

хороший ответ. Другой точки зрения. – Dhananjay

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