Ошибка при попытке реализовать шаблон Bridge в Java - PullRequest
1 голос
/ 03 ноября 2011

Я хочу передать объект Shape объекту ShapeImp, например Vector или Raster. Ошибка возникает при попытке передать «это» изнутри конструкторам Circle и Square. Я хочу передать конкретные формы в Vector или Raster.

Ошибка NetBeans в строке

super (платформа, x, y, this, "Circle999");

"не может ссылаться на это до вызова конструктора супертипа Утечка это в конструктор "

package dp.bridge;

//-------Abstraction-------//

//----Abstraction-Specialization----------//
abstract class Shape{

    protected ShapeImpl platform;
    protected String type;

    Shape(String p, int x, int y, Circle s, String type){
        this.type = type;
        if(p.equals("vector"))
            platform = new Vector(x,y,s);
         if(p.equals("raster"))
            platform = new Raster(x,y,s);
    }

    public String getType() {
        return type;
    }


     abstract public void draw();
}
class Circle extends Shape{



    Circle(String platform, int x, int y){
        super(platform, x,y, this, "Circle999");

    }

    public void draw(){
        System.out.println("Circle: draw()");
        platform.draw();
    }

}

class Square extends Shape{

     Square(String platform, int x, int y){
        super(platform, x,y,this, "Square778");
     }

    public void draw(){
        System.out.println("Square: draw()");
        platform.draw();
    }

}

//----Abstract-Implementation------//
interface ShapeImpl{
    public void draw();

}

//--------Concreate implemenations--------//
class Raster implements ShapeImpl{

    int _x;
    int _y;
    Shape s;
    Raster(int x, int y, Shape s){
        _x = x;
        _y = y;
        this.s = s;
    }

    public void draw(){
        System.out.println("Drawing Raster "+s.getType()+ " at (" +_x + "," + _y +")");

    }
}

class Vector implements ShapeImpl{

    int _x;
    int _y;
    Shape s;
    Vector(int x, int y, Shape s){
        _x = x;
        _y = y;
        this.s = s;

    }

    public void draw(){
        System.out.println("Drawing Vector "+s.getType()+ " at (" +_x + "," + _y +")");

    }


}

//-----Client-------//
class Client{


    public static void main(String atgsp[]){
       Shape[] shapes= {new Circle("raster", 10, 40), new Square("vector", 2,2)};

        for(Shape s:shapes){
            s.draw();
        }
    }
}

1 Ответ

1 голос
/ 03 ноября 2011

Вы передаете объект себе? Вам не нужно этого делать (и вы не можете, безусловно). this в суперклассе все еще будет преобразовываться в текущий объект.

Таким образом, вместо передачи this в качестве аргумента супер-конструктору, просто используйте this в суперконструкторе: new Vector(x, s, this)

...