2012-05-08 4 views
1

Предположим, что я хочу наследовать класс A и класс B классу C (здесь B также расширяет A). Я очень хорошо знаю, что хотя я никогда не могу сделать это прямо на Java, но используя наследование Мичина (Link: http://csis.pace.edu/~bergin/patterns/multipleinheritance.html), то есть использование одного интерфейса и другого в качестве базового класса и внутренне использующего делегирование, я могу это сделать, когда A & B не имеют никакого отношения класса.Как унаследовать два класса в третьем классе, когда первые два в базовом отношении связаны с классом?

Как сделать то же самое, когда а & B есть родитель ребенка их сам, и мне нужно, чтобы наследовать оба в C?

Просто для информации, я пытаюсь сделать то же самое для достижения неизменности в классах A & B.

+1

Подождите, что? Я не уверен, что вы говорите «A extends B», или если «A extends D» и «B extends E». В любом случае вы _cannot_ расширяете несколько классов - вы можете расширить только один класс и несколько интерфейсов. –

+0

@ Louis Спасибо, но, как я уже сказал, я также прекрасно знаю, что я не могу продлить более одного класса. Но каковы программные обходные пути для этого (если есть?), Если мне это абсолютно необходимо. – vmishra

+0

На самом деле их нет. Вы могли бы заставить 'C' иметь' A' и 'B'_fields_, переключая отношения с« is-a »на« has-a », но кроме этого? В принципе, вы ничего не можете сделать. –

ответ

1

Если ваш class B уже расширяет class A, а затем class C продлить class B уже сделал бы трюк. путем расширения class B вы также получаете всю функциональность от class A, которые не были специально преодолено в class B

Предположительно вы бы в конечном итоге с:

class A 
{ 
    public string hello() 
    { 
     return "Hello, World!"; 
    } 
} 

class B extends A 
{ 
} 

class C extends B 
{ 
} 

C foo = new C(); 
foo->hello(); // "Hello World!" because it is defined in A 
+0

Спасибо за ответ Крис, хотя логика, которую вы дали, не вызывает затруднений, но вы должны понять, что я пытаюсь сделать КЛАСС А и КЛАСС B неизменными, ваша логика не выполняется, когда я пытаюсь достичь неизменности не устанавливая ничего непосредственно на элементах данных A или B. – vmishra

+1

в этом случае вам нужны (неизменные версии) 'A' и' B', которые должны быть созданы в конструкторе 'C' и назначены частным полям в' C', много сантехники и никогда (в), непосредственно не подвергая ссылки из публичного API в 'C'. Я не знаю другого способа, чем делегировать всю необходимую для пользователя логику вручную на Java. Я не верю, что что-то похожее на магию php's __get и __call существует в java. – Kris

+0

да, я думаю, это то, что я должен делать для вещи непреложности, я не вижу другого элегантного способа сделать то же самое. Спасибо, Крис! – vmishra

0

почему бы вам не сделать КЛАССА А абстрактный класс, а затем расширьте это в B и C. Пусть ваши общие методы сидят в A как абстрактные (или могут быть определены), и вы можете затем переопределить их в конкретных классах.

+0

Да, это хороший момент, но проблема в том, что у меня есть существующий класс A, который уже используется в течение длительного времени и имеет несколько подклассов, следовательно, изменение одного и того же будет влиять на многое. Но, спасибо в любом случае! – vmishra