2016-04-11 16 views
7

Đối với lớp Cube, tôi đang cố gắng để thoát khỏi các lỗi:Làm việc với siêu trong java

Cube.java:12: error: constructor Rectangle in class Rectangle cannot be applied to given types; 
    super(x, y); 
    ^
    required: int,int,double,double 
    found: int,int....... 

Tôi biết mỗi khuôn mặt của một Cube là một Rectangle có chiều dài và nhu cầu rộng để được giống như bên cạnh một khối lập phương nhưng tôi không chắc chắn những gì cần phải được thông qua để các nhà xây dựng hình chữ nhật để làm cho chiều dài và chiều rộng của nó giống như bên của một khối lập phương.

cũng cố gắng để tính toán khối lượng là khu vực của thời đại hình chữ nhật theo chiều dài của hai bên Cubes

Đây là lớp Cube

// --------------------------------- 
// File Description: 
// Defines a Cube 
// --------------------------------- 

public class Cube extends Rectangle 
{ 


    public Cube(int x, int y, int side) 
    { 
    super(x, y); 
    side = super.area(); // not sure if this is right 
    } 


    public int getSide() {return side;} 

    public double area()  {return 6 * super.area();} 
    public double volume() {return super.area() * side;} 
    public String toString() {return super.toString();} 
} 

và đây là lớp hình chữ nhật

// --------------------------------- 
// File Description: 
// Defines a Rectangle 
// --------------------------------- 

public class Rectangle extends Point 
{ 
    private int x, y; // Coordinates of the Point 
    private double length, width; 

    public Rectangle(int x, int y, double l, double w) 
    { 
    super(x, y); 
    length = l; 
    width = w; 
    } 

    public int  getX()   {return x;} 
    public int  getY()   {return y;} 
    public double getLength() {return length;} 
    public double getWidth()  {return width;} 

    public double area()  {return length * width;} 
    public String toString() {return "[" + x + ", " + y + "]" + " Length = " + length + " Width = " + width;} 
} 
+3

Từ 'Rectangle' không có một constructor mà mất 2 lập luận, những gì đang làm bạn mong đợi để được gọi khi bạn gọi' siêu (x, y); '? – azurefrog

+1

Bạn có chắc 'Cube' của bạn cần kế thừa từ' Hình chữ nhật' và không chỉ đơn giản là giữ một mảng 'Hình chữ nhật', mỗi ô có 'Điểm và chiều dài' của riêng nó? Ngoài ra, vì 'Rectangle' mở rộng' Point', bạn không cần phải định nghĩa 'x',' y', 'getX' hoặc' getY' trong 'Rectangle' - bạn thừa hưởng các thuộc tính này. –

Trả lời

10

Việc xây dựng đối tượng này dường như bỏ lỡ ý tưởng mở rộng.

A Cube không phải là Rectangle. Một Cube có thể được coi là một tổng hợp của nhiều Rectangle s với dữ liệu không gian cho định hướng, nhưng sau đó hình chữ nhật phải là thành viên (đọc thuộc tính/trường) của Cube.

Để minh họa điểm này, hãy xem xét sự khác biệt giữa các câu sau.

Tất cả các hình khối đều là hình chữ nhật.

Tất cả mèo đều là động vật.

bạn có thể tạo ra một đối tượng Cat mở rộng siêu lớp Animal. Cube s và Rectangle s không chia sẻ mối quan hệ này.

xem xét refactoring mã của bạn để có một cái gì đó như:

public class Cube { 
    private List<Rectangle> faces: 

    .... 

} 

Để thực hiện việc này một bước xa hơn, không phải tất cả Rectangle s là Point s.

Điểm là một cặp tọa độ x, y. Để vẽ chính xác Rectangle lượng thông tin tối thiểu bắt buộc là hai Point s.

thấy

+-- 
| | 
--+ 

Nếu bạn có góc đối diện Point s (đánh dấu đây bởi +) bạn có thể vẽ Rectangle của bạn.

Trong điều kiện này, có lẽ bạn cũng nên refactor Rectangle để có một cặp Point s làm thành viên.

cái gì đó như:

public class Rectangle { 
    private Point firstCorner; 
    private Point secondCorner; 

    ... 
} 
3

Vấn đề là Rectangle hàm tạo dự kiến ​​4 đối số và bạn chỉ chuyển cho anh ta 2 khi tạo cá thể Cube. Bạn cũng nên vượt qua chiều dài của mình:

public Cube(int x, int y, int side) 
    { 
    super(x, y, side, side); 
    } 

Nếu bạn nghĩ rằng nó có ý nghĩa hoàn hảo - bất kỳ hình chữ nhật nào cần nguồn gốc x và y, chiều rộng và chiều cao. Trong trường hợp chiều rộng và chiều cao của khối lập phương giống nhau, nhưng bạn vẫn nên nói cho hình chữ nhật giá trị của chúng là gì;)

2

Số đối số trong số super(x, y) không khớp với các đối số trong hàm tạo của lớp Rectangle. Khi bạn gọi một constructor super class một cách rõ ràng, bạn phải chắc chắn rằng super class có một hàm tạo phù hợp.

2

Siêu lớp của RectangleCube không Point. Sử dụng super() bạn có thể gọi hàm tạo của Cube không phải là hàm tạo của Point

Các vấn đề liên quan