2016-03-14 2 views
2

У меня возникла проблема с конструкторами.Java несколько конструкторов с одним параметром в каждом и другом типе

public abstract class ShapeDrawer implements iShapeDrawer { 

    protected SimpleLine line; // the line to be drawn 
    protected SimpleOval oval; // the oval to be drawn 
    protected SimpleTriangle triangle; // the triangle to be drawn 
    protected SimplePolygon rectangle; // the triangle to be drawn 

    public ShapeDrawer(SimpleLine line) { 
     this.line = line; 
    } 

    public ShapeDrawer(SimpleOval oval) { 
     this.oval = oval; 
    } 

    public ShapeDrawer(SimpleTriangle triangle) { 
     this.triangle = triangle; 
    } 

    public ShapeDrawer(SimplePolygon rectangle) { 
     this.rectangle = rectangle; 
    } 
} 

Когда я пытаюсь запустить, он идет к первому constuctor и броски и ошибки для каждого конструктора.

error: incompatible types: SimpleOval cannot be converted to SimpleLine super(oval);

И это немного из Овального класса

public class OvalDrawer extends ShapeDrawer implements iShapeDrawer{ 

    public OvalDrawer(SimpleOval oval) { 
     super(oval); 
    } 
} 

И у меня есть SimpleShape класс, который является родительским классом SimpleOval, SimpleLine и т.д., и имеет все методы. Пример SimpleOval

public class SimpleOval extends SimpleShape { 

public SimpleOval(int xStart, int yStart, int xEnd, int yEnd, Color colour, int thickness, ShapeType shapeType) { 
    super(xStart, yStart, xEnd, yEnd, colour, thickness, shapeType); 
} 

Любые предложения?

+0

Просто примечание: 'OvalDrawer' не должен реализовывать' iShapeDrawer', потому что он расширяет 'ShapeDrawer', который уже реализует этот интерфейс. – Berger

+2

Я не могу воспроизвести эту проблему. – Tom

+0

Мое предложение состояло в том, чтобы иметь специальную реализацию ShapeDrawer для каждой из классов SimpleLine, SimpleOval и т. Д. –

ответ

5

Я хотел бы предложить, чтобы сделать ShapeDrawer родовыми, с типом-параметром некоторые подкласс Shape:

public abstract class ShapeDrawer<T extends Shape> implements iShapeDrawer { 
    protected T shape; //the shape to be drawn 

    public ShapeDrawer(T shape) { 
     this.shape = shape; 
    } 
} 

Затем каждый из различных форм будут иметь соответствующий ShapeDrawer класс. Например, SimpleOval будет нарисованы:

public class SimpleOvalDrawer extends ShapeDrawer<SimpleOval> { 
    public SimpleOvalDrawer(SimpleOval oval) { 
     super(oval); 
    } 
} 

Похожие классы должны быть введены для других Shape подтипов.

Существует также нет необходимости SimpleOvalDrawer, чтобы явно реализовать интерфейс iShapeDrawer, так как ShapeDrawer уже делает.

+0

Ящик должен нарисовать фигуры и не должен быть их суперклассом. Вот что я думаю. :) –

+0

Я пробовал ваше решение, не работал. Я обновил некоторую информацию о своем посте. Это может быть изменение – Antoshjke

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