2013-03-01 1 views
1

Так что я выполняю задание для школы в java ... Это иерархическая иерархия классов, и мы предполагаем, чтобы создать класс «Triangle.java», который расширяет класс «ClosedShape.java», который расширяет «Shape.java» ... ClosedShape и Shape даются нам, поэтому, скорее всего, с ними ничего плохого (i ' выложим их в любом случае), но мой класс Triangle выглядит следующим образом:Конструктор ... не применим (фактические и формальные списки аргументов различаются по длине) - но он соответствует

public abstract class Triangle extends ClosedShape{ 

     public Triangle(int[] a, int[] b, int base, int height){ 
      super(true, 3, a, b); 
      setWidth(base); 
      setHeight(height); 
      setXYCoords(a, b); 
     } 

     public Triangle(int x, int y, int base, int height){ 
      int[] a = new int[3]; 
      int[] b = new int[3]; 

      a[0] = x; 
      a[1] = (x+base)/2; 
      a[2] = (x+base); 

      b[0] = y; 
      b[1] = (y+height)/2; 
      b[2] = (y+height); 
     } 

} 

причина у меня есть два конструктора, потому что мне нужно, чтобы создать эти два массив для хранения точек для рисования формы ... и тогда мне нужно чтобы они перешли в класс ClosedShape (boolean, int, int [], int []) super class ... if i создайте массивы в том же конструкторе, которые им нужно будет определить перед вызовом super(), чтобы они могли быть переданы, но это не разрешено, потому что вызов super() должен быть первым ... так что в настоящее время, когда я пытаюсь компилировать Triangle.java я получаю сообщение об ошибке:

Triangle.java.14: error: no suitable constructor found for ClosedShape() 
    { //little arrow pointing under the '{' 

constructor ClosedShape.ClosedShape(boolean, int, int[], int[]) is not applicable 
    (actual and formal argument lists differ in length)  
    constructor ClosedShape.ClosedShape(boolean, int) is not applicable 
    (actual and formal argument lists differ in length) 
1 error 

Он также указывает, в задании, что подпись для треугольника должен быть Traingle (целое х, у ИНТ, внутр база, внутр высота) ... Итак ... я запутался, потому что, если я не ошибаюсь (что я думаю, что я ...), я сделал супер-вызов со всеми правильными значениями, а там - это конструктор «ClosedShape (boolean, int , int [], int []) "... имеет класс ClosedShape:

import java.awt.Graphics; 

public abstract class ClosedShape extends Shape { 
    boolean polygon; 
    int numPoints; 
    int[] xVertices; 
    int[] yVertices; 
    int x,y,width, height; 

    public ClosedShape(boolean isPolygon, int numPoints) { 
     super(0,0); 
     this.polygon = isPolygon; 
     this.numPoints = numPoints; 
    } 

    public ClosedShape(boolean isPolygon, int numPoints, int[] x, int[] y) { 
     super(x[0],y[0]); 
     this.polygon = isPolygon; 
     if (isPolygon) { 
      this.numPoints = numPoints; 
      xVertices = new int[numPoints]; // error check? if x.length == numPoints 
      //for (int i = 0; i < x.length; i++) { // make copy of array: why? 
      // xVertices[i] = x[i]; 
      //} 
      yVertices = new int[numPoints]; // error check? if y.length == numPoints 
      for (int i = 0; i < y.length; i++) { // make copy of array 
        yVertices[i] = y[i]; 
      } 
     } 
     else { // its an oval - define bounding box 
      this.numPoints = 4; 
      this.x = x[0]; 
      this.y = y[0]; 
      width = x[1]; 
      height = y[1]; 
     } 
    } 

    public void setXYCoords(int[] x, int[] y){ 
     this.xVertices = x; 
     this.yVertices = y; 
    } 

    // Gives access to the width attribute 
    public void setWidth(int width){ 
     this.width = width; 
    } 

    // Gives access to the height attribute 
    public void setHeight(int height) { 
     this.height = height; 
    } 

    public void draw(Graphics g) { 
     if (polygon) { 
      g.drawPolygon(xVertices, yVertices, numPoints); 
     } 
     else { 
      g.drawOval(x, y, width, height); 
     } 

    } 

    public abstract double Area(); 
    public abstract double Perimeter(); 








} 
+4

Мой совет? Верьте компилятору. Ваш код неправильный. – duffymo

+0

Изменение второго конструктора в public void Triangle (...) делает его больше не константатором. Теперь он становится обычным методом в треугольнике. Таким образом, он теперь компилируется, потому что вы изменили свой конструктор проблем, чтобы не быть конструктором. – Marshmellow1328

+0

Это сумасшедший совет. Если вам нужен конструктор, напишите его правильно. – duffymo

ответ

1

Я, наконец, понял это. Я звоню конструктору, который мне даже не нужно использовать! Мне нужно только, чтобы сделать вызов первого конструктора затем использовать метод setXYCoords() делать то, что мне нужно делать с массивами .... Heres мой окончательный код:

(ClosedShape.java остался тот же)

import java.awt.Graphics; 

public class Triangle extends ClosedShape{ 

    public Triangle(int x, int y, int base, int height){ 
     super(true, 3); 

     setWidth(base); 
     setHeight(height); 

     int [] arrayX = new int[3]; 
     arrayX[0] = x; 
     arrayX[1] = (x+(width/2)); 
     arrayX[2] = (x+width); 

     int [] arrayY = new int[3]; 
     arrayY[0] = y; 
     arrayY[1] = (y-height); 
     arrayY[2] = y; 

     setXYCoords(arrayX, arrayY); 

    } 

    public double Area(){ 
       return 0; 
    } 

    public double Perimeter(){ 
     return 0; 
    } 


} 
4

Проблема в том, что для ClosedShape нет конструктора no-arg по умолчанию.

Посмотрите на этот CTOR:

public Triangle(int x, int y, int base, int height){ 

Там нет явного вызова в super() конструктор, поэтому компилятор предполагает, что он должен вызвать конструктор без аргументов. Но нет ни одного ...

+0

Лучше проверьте себя, user93353. Это другой вопрос, а не тот, на который вы смотрите. – duffymo

+0

Я понимаю, что я сделал не так ... Я отредактировал его и поместил свое единственное изменение ха-ха, если я не ошибаюсь, все должно быть хорошо сейчас ... Надеюсь, хахаха он скомпилировал :) спасибо! – MicroMumbler

+0

Так что же такое изменение? Написание конструктора no-arg для ClosedShape или, еще лучше, добавление правильного супервызовов в Triangle? – duffymo

-1

Как указано @duffymo, если вы явно не вызываете super(), компилятор вставляет вызов конструктору no-arg.

Я думаю, что решение, которое вы ищете, является методом Factory. Вы можете создать статический метод, например, createTriangle(int x, int y, int base, int height). Создайте свои массивы в этом методе, вызовите соответствующий конструктор и верните построенный объект.

+0

Ему не нужно использовать статический метод или заводскую установку. Ему нужно подойти ближе к классу ClosedShape. – Marshmellow1328

+0

Я не думаю, что совет от Marshmellow1328 является лучшим в свете вышеприведенного комментария. – duffymo

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