2016-04-18 2 views
2

В Java существует такое свойство, как динамическое наследование?Динамическое наследование в Java

Просто, чтобы уточнить, путем динамического наследования я имею в виду: могу ли я указать, из какого класса я наследую определенный класс во время выполнения? (A наследует от {X | X ∈ {P, T, Q}})

Я просто пытаюсь понять, каковы мои варианты, если мне нужно реализовать, скажем, класс Animal, который будет иметь следующие дочерние классы : FlyingAnimal, WalkingAnimal, SwimmingAnimal и т. Д.

В то же время мне нужно разделить Animal на Humans и NonHumans, которые будут иметь несколько другое поведение. То, что я хочу сделать, - это вывести людей и нехумов из животных, а затем вывести животных из Walkable и т. Д. - Я хочу решить, какой из них он будет во время выполнения (предполагая, что животное может либо ходить, либо летать).

+5

Короткий ответ: нет. Длинный ответ: noooooo. Вы не можете делать это динамически во время выполнения. –

+0

@LouisWasserman ха-ха, хороший :-) –

+0

Вы должны реализовать все классы, в которых вы нуждаетесь. И выберите его во время выполнения. – saka1029

ответ

2

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

No. Java представляет собой скомпилированный язык с проверкой типов времени компиляции. Тем не менее, можно использовать , чтобы использовать библиотеку манипуляции с байтовым кодом, например BCEL, для создания байт-кодов во время выполнения; на домашней странице BCEL один интересное приложение является создание классов с нуля во время выполнения

+0

Спасибо @Elliot! Я посмотрю на это, хотя, я не чувствую, что знание Java достаточно для того, чтобы попасть в манипуляции с байтами (по крайней мере, пока). Но есть ли способ наследовать класс X из одного класса (A), а затем сделать что-то вроде кастинга результата экземпляру дочернего класса (B)? –

3

Правильный способ или решения подобных ситуаций обычно (де-) состав и делегация (эти ключевые слова в искать).

Например, ваш класс может содержать объект этих классов и просто использовать его вместо наследования.

т.е.

interface Engine {} 
class Diesel implements Engine {} 
class Electric implements Engine {} 
class Car /* NOT extends Diesel/Electric */ { 
    Enigne engine; /* delegate or composition pattern */ 
} 
Смежные вопросы