У меня есть иерархия классов так:Java - расширение иерархии целого класса
abstract class BaseThing
{
public abstract void doSomething();
}
class Thing1 extends BaseThing
{
@Override
public void doSomething()
{
doSomethingWithThing1();
}
}
class Thing2 extends BaseThing
{
@Override
public void doSomething()
{
doSomethingWithThing2();
}
}
// A dozen more classes that extend the BaseThing class.
Мне нужно создать расширенную версию всего дерева. На Java нет множественного наследования, поэтому я создал его как:
interface BaseThingExt
{
public void doSomethingElse();
}
class Thing1Ext extends Thing1 implements BaseThingExt
{
@Override
public void doSomethingElse()
{
doSomethingElseWithThing1();
}
}
// All Thing.. classes are extended by ThingExt... classes
Теперь вопрос. Где я могу поместить некоторые общие поля для всех классов ThingExt? Я не могу поместить их в базовый интерфейс, так как они станут final static
. Я не могу сделать BaseThingExt абстрактным классом, поскольку Java не поддерживает множественное наследование. Я не могу поверить, что единственное решение - это повторить их десятки раз во всех классах ThingExt!
EDIT: Обратите внимание, что все классы ThingExt должны расширять свои классы Thing, а не только класс BaseThing, потому что в каждом производном классе есть некоторые особенности. Поэтому ответ @Hamdi Douss не будет работать.
Почему вы не реализуете 'BaseThingExt' в' BaseThing' и не расширяете 'Thing1' и' Think2'. –
@Shree Krishna: BaseThing и BaseThingExt живут в разных пакетах. Бывают ситуации, когда только BaseThing должен быть доступен клиентам. – Flot2011
Можете ли вы создать абстрактный класс, который реализует интерфейс, включая ваши поля, с абстрактными методами getters/seters для реализации и расширения конкретных классов? –