Класс SUPER должен получить функцию и атрибут из своего SUBCLASS. это возможно в Java? - PullRequest
1 голос
/ 14 июня 2011
       A    
a1    a2    a3* 

В этом примере A является классом SUPER, и он имеет a1, a2 в качестве подклассов.

Предположим, a3 добавлен в A, тогда я бы хотел, чтобы A получил функцию от a3 (этонеобязательный).Эта дополнительная функция a3 должна перейти в A (суперкласс), а также все другие дочерние элементы (a1, a2) должны получить эту функцию.

Возможно ли это в Java или Java-дизайне?

Ответы [ 7 ]

7 голосов
/ 14 июня 2011

Нет. Это не поддерживается Java. Обратите внимание, что

class A1 extends A

не следует интерпретировать как «Я добавляю материал в A» . Его следует интерпретировать как "Вот новый класс , и в качестве основы для этого класса я буду использовать A" .


Если у вас есть некоторые аспекты a1, a2 и a3, которые должны быть доступны для A и, следовательно, a1, a2 и a3, я предлагаю вам сделать что-то вроде

class A {
    protected A1 a1 = new A1();
    protected A2 a2 = new A2();
    protected A3 a3 = new A3();

    ...
}

Вы также можете сделать A1, A2 и A3 нестатическими внутренними классами, чтобы они имели ссылку на экземпляр инкапсулирующего A.

4 голосов
/ 14 июня 2011

Нет Суперкласс не может иметь функциональность подкласса, возможен только обратный ход.

В вашем случае a3 может иметь все методы, определенные в A, но любые вновь определенные методы в a3, которых нет в A, not автоматически добавляются в A. Если вы хотите использовать новую функциональность во всех подклассах, почему бы не добавить его прямо в супер класс. Поэтому добавьте новую функциональность в A, затем получите доступ к ней в a1, a2 и a3.

2 голосов
/ 14 июня 2011

Может быть, вам следует использовать композицию вместо наследования?Когда дизайн правильный, вы не должны ожидать такой проблемы.Возможно, шаблон стратегии подходит в этой ситуации.

2 голосов
/ 14 июня 2011

Родители не знают о детях. Функциональность течет вниз по иерархическому дереву, а не вверх.

1 голос
/ 14 июня 2011

Нет, наследование в целом не поддерживает такое поведение, в Java или где-либо еще. И это хорошо.

Когда у вас есть класс, расширяющий другой, вы выражаете отношения IS-A. Один класс - это вид другого. Лев это животное. Купе это машина. Что-то в этом роде.

Предположим, что человек - это человек, а марсианин - это человек. Теперь, допустим, мы добавили еще один класс - криптонианца, который также является человеком. Добавление Kryptonian не дает вам рентгеновское зрение. К сожалению.

0 голосов
/ 14 июня 2011

Читая ваш вопрос, звучит так, как будто вы пришли из C ++ фона и ранее использовали множественное наследование.

Абстрактный суперкласс A имеет абстрактную (виртуальную) функцию f ().

Абстрактный подкласс a1 наследуется от A и имеет функцию f1 (), которая вызывает f (), но не реализует f ().

Подкласс a2 наследует от A и реализует f ().

Подкласс aa1 наследует от a1 и a2, в результате чего aa1 становится неабстрактным, а aa1.f1 () вызывает a2.f().

Это невозможно в Java.Нет множественного наследования.Посмотрите на композицию или какую-либо форму паттерна стратегии.

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

0 голосов
/ 14 июня 2011

Проверьте шаблон посетителя - он используется для такого рода проблем!

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