2013-04-19 3 views
0

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

Есть ли способ сделать это?

Вот фрагмент кода из линейного класса. Класс полилинии также должен иметь getMidPoint(), containsPoint (x, y) и т. Д. Я еще не написал код для дуги окружности, но будет иметь аналогичную функциональность getMidPoint(), containsPoint (x, y).

public Line (double x1,double y1, double x2,double y2){ 
    super (x1,y1,x2,y2); 
} 
public ACSPoint getMidPoint(){ 
    ACSPoint p = new ACSPoint(); 
    p.x((this.start.x()+this.end.x())/2); 
    p.y((this.start.y()+this.end.y())/2); 
    return p; 
} 
@Override 
public boolean containsPoint(double x, double y){ 
    boolean containsPoint = super.containsPoint(x, y); 
    if (containsPoint){ 
     if (x<this.start.x()||x>this.end.x()){ 
      return false; 
     } 
    } 
    return containsPoint; 
} 
@Override 
public boolean containsPoint(ACSPoint p){ 
    return this.containsPoint(p.x(), p.y()); 
} 
+0

Можете ли вы представить эскиз вашего предполагаемого кода? – noahlz

+0

Интерфейсы заключают контракты во время компиляции (поэтому класс, реализующий интерфейс, будет иметь реализацию этого интерфейса). Я не совсем понимаю ваш вопрос из описания; вы могли бы представить модель того, как выглядят ваши классы? – Makoto

ответ

4

Поскольку Java не поддерживает наследование от нескольких классов, вы можете использовать Object Composition.

Затем PolyLine класса

  • реализовывать интерфейсы линейных и дуговых
  • состоят из реализаций Line и Arc.
  • делегировать вызовы методам в линейных и дуговых интерфейсах к соответствующим объектам.

Недостатком этого является то, что ваша PolyLine привязана к одной реализации интерфейсов Line или Arc. Вы можете предотвратить это, разрешив их устанавливать во время строительства. В типичной среде DI реализация будет вводиться или размещаться вместо жесткой проводки.

  • линия: интерфейс и реализация:

    // Interface: Line.java 
    public interface Line 
    { 
        void lineMethod(); 
    } 
    
    // Implementation: DefaultLine.java 
    public class DefaultLine implements Line 
    { 
        public void lineMethod() 
        { 
    
        } 
    } 
    
  • Arc: интерфейс и реализация

    // Interface: Arc.java 
    public interface Arc 
    { 
        void arcMethod(); 
    } 
    
    // Implementation: DefaultArc.java 
    public class DefaultArc implements Arc 
    { 
        public void arcMethod() 
        { 
    
        } 
    } 
    
  • PolyLine: интерфейс и реализация, где реализация линии и дуги зашитым:

    public interface PolyLine extends Line, Arc 
    { 
    
    } 
    
    public class DefaultPolyLine implements PolyLine 
    { 
        private Line line; 
        private Arc arc; 
    
        public DefaultPolyLine() 
        { 
         line = new DefaultLine(); 
         arc = new DefaultArc(); 
        } 
    
        public void lineMethod() 
        { 
         line.lineMethod(); 
        } 
    
        public void arcMethod() 
        { 
         arc.arcMethod(); 
        } 
    } 
    
  • реализация PolyLine где реализация линии и дуги устанавливаются в процессе строительства:

    public class DefaultPolyLine implements PolyLine 
    { 
        private Line line; 
        private Arc arc; 
    
        public DefaultPolyLine(Line line, Arc arc) 
        { 
         this.line = line; 
         this.arc = arc; 
        } 
    
        public void lineMethod() 
        { 
         line.lineMethod(); 
        } 
    
        public void arcMethod() 
        { 
         arc.arcMethod(); 
        } 
    } 
    

Последняя реализация PolyLine позволяет клиенту установить любую реализацию линии вместо всегда использовать DefaultLine реализации и то же самое для дуги.

+0

Я принял ваш ответ, но вы можете объяснить, что вы подразумеваете под «установкой во время строительства».Спасибо – Adil

+1

Что-то интересное: если вы дождались, пока Java 8 не будет выпущен, он поддерживает реализованные методы в интерфейсах, своего рода множественное наследование;) –

+0

@Adil, пожалуйста, найдите обновленный ответ. – Vikdor

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