2010-11-19 3 views
0

Я пытаюсь понять, как создать иерархию классов для класса Carrier, который я реализую.Проектирование иерархии классов без множественного наследования в Java

В настоящее время у меня есть абстрактный базовый класс Carrier.

У меня есть еще один абстрактный класс TimedCarrier (TC), который расширяет несущую со временем и информацией, относящейся к домену. Конкретные классы распространяются от Carrier и TimedCarrier.

Пользователю необходим монитор прогресса, поэтому я создаю абстрактный класс MonitoredCarrier (MC), который простирается от Carrier. Конкретные классы распространяются от Monitored Carrier.

Это работает нормально, пока пользовательские требования не изменятся. Теперь мне нужен MonitoredTimedCarrier. Я, очевидно, не могу подклассы как TC, так и MC. Я имею в виде реализации MC в качестве интерфейса:

class TimedCarrier implements IMonitored 
class Carrier implements IMonitored 

(так что имеет смысл для меня в контексте этой области, я должен быть в состоянии контролировать Перевозчик ли или нет, они приурочены), но MC - это богатый класс, и мне придется копировать все методы в классы, которые распространялись от MC. Я не хочу дублировать код.

Как бы я тогда решить эту проблему? Благодарю.

[Редактировать]

TimedCarrier расширяет Carrier с кучей переменных членов и методов геттер/инкубационные. MonitoredCarrier расширяет несущую с переменными-членами, методами getter/setter и множеством методов, которые работают с монитором.

class TimedCarrier extends Carrier { 
    int var1.. 
    int var2.. 

    public void setVar1(int var1) {...} 
    public int getVar1() {...} 
    .... 
} 

class MonitoredCarrier extends Carrier { 
    int var1.. 
    int var2.. 

    public void setVar1(int var1) {...} 
    public int getVar1() {...} 
    .... 
    public void monitorSomething() {...} 
    public void monitorOtherSomething() {...} 
} 

ответ

3

Это звучит так, как будто вы должны рассматривать возможность использования делегирования. Например, вместо класса , продолжающегосяTimedCarrier, он просто расширяет Carrier, но затем передается конструктору TimedCarrier в качестве делегированного экземпляра. TimedCarrier затем делегирует операции, но также отслеживает время.

Ditto MonitoredCarrier.

Конечно, не зная подробностей о том, что происходит, трудно сказать, подходит ли это, но это тот подход, который я использовал несколько раз. (Нужно ли вам Carrier быть абстрактным классом, а не интерфейсом? Может, имеет смысл иметь интерфейс, а затем абстрактный класс, реализующий интерфейс для общих операций?)

+0

Должен согласиться. Во многих случаях наследование наследования козырей. – gpampara

2

Я бы подошел к нему как к это,

interface Timeable {....} 
interface Monitorable {....} 
interface Carrier {....} 

И затем идите с этим.

class TimedCarrier implements Carrier, Timeable {....} 
class MonitoredCarrier implements Carrier, Monitorable {....} 
class MonitoredTimedCarrier implements Carrier, Timeable, Monitorable {....} 

Его не надуманная идея. Его везде в Java API. Посмотрите на Runnable, Comparable и тому подобное.

0

Я бы использовал в качестве интерфейсов несущий, таймер и монитор, чтобы классы могли реализовать в зависимости от того, что им нужно.

Что касается смешения в функциональности, вы можете заставить MonitoredTimedCarrier расширить MonitoredCarrier и реализовать Timer, а затем проксировать все методы Timer во внутренний класс, который расширяет ваш абстрактный класс с помощью необходимых функций.

Это всего лишь один из возможных способов, существует несколько шаблонов дизайна, которые могли бы помочь вам здесь. Удачи!

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