2017-04-16 16 views
5

Tôi đang nghiên cứu mô phỏng vật lý.Một lời khuyên cho một thiết kế giữa các lớp cha và con?

Tôi có một ArrayList chứa tất cả các đối tượng trong mô phỏng của tôi. Tôi có một lớp cha mẹ: Shape và hai lớp con: CircleRectangle.

Lớp cha, tất nhiên, không có phương thức draw() nhưng mỗi lớp con đều có. Do đó, khi tôi lặp lại máng danh sách để vẽ từng phần tử, nó không cho phép tôi vì không có phương thức draw() trong lớp Shape (như tôi định nghĩa danh sách là ArrayList<Shape> và thêm mỗi phần tử mới với một thể hiện lớp con).

Có cách nào giải quyết vấn đề này một cách tốt và gọn gàng không?

+2

Bạn muốn có phương thức 'abstract'. – SLaks

+0

Tôi đã cố định nghĩa lớp hình dạng là trừu tượng và sau đó thêm phương thức vẽ trừu tượng, nhưng vẫn không hoạt động @SLaks – Robot0110

+0

nếu bạn đang tạo đối tượng Circle trong ArrayList thì nó sẽ hoạt động tốt – abcOfJavaAndCPP

Trả lời

4

Cách gọn gàng nhất để chuyển tiếp là sử dụng giao diện.

public interface Shape { 
    void draw(); 
} 

public class Rectangle implements Shape { 
    @Override 
    public void draw() { // draw rect } 
} 

public class Circle implements Shape { 
    @Override 
    public void draw() { // draw circle } 
} 

Nếu bạn muốn hình dạng chia sẻ một số logic khác với trẻ, bạn có thể tạo lớp AbstractShape triển khai Hình dạng với bất kỳ mã bổ sung nào và mở rộng lớp con bằng lớp trừu tượng này.

+2

Vì giao diện này chỉ khai báo phương thức 'draw()', tôi đặt tên giao diện là 'Drawable', thay vì' Shape'. – AJNeufeld

+0

@AJNeufeld vâng, điều đó sẽ tốt hơn. Giao diện thông thường phải là tên sau khi tính từ. – abhipil

4

có vẻ như cung cấp phương pháp trừu tượng cho lớp Shape nơi tất cả các lớp con chia sẻ một hành vi chung là tốt nhất cho nhiệm vụ trong tầm tay.

Xem xét việc này là lớp Shape:

public abstract class Shapes{ 
    public abstract void Draw(); 
} 

các Rectangle lớp:

public class Rectangle extends Shapes{ 
    public void Draw(){ 
     System.out.println("Rectangle"); 
    } 
} 

các Circle lớp:

public class Circle extends Shapes{ 
    public void Draw(){ 
     System.out.println("Circle"); 
    } 
} 

tại xem xét rằng cả hai CircleRectangle là kiểu Shape, bạn có thể tạo các đối tượng của loại Circle hoặc/và Rectangle, thêm chúng vào ArrayList, lặp trên nó, và gọi phương thức Draw() trên từng đối tượng như sau:

ArrayList<Shapes> shapes = new ArrayList<>(); 
shapes.add(new Circle()); 
shapes.add(new Rectangle()); 
shapes.forEach(Shapes::Draw); 

kết quả khi Draw() phương pháp được gọi trên mỗi đối tượng:

Circle 
Rectangle 
0

Đây là cách tôi sẽ làm.

Một lớp được gọi là Shapes có một lĩnh vực cho Danh sách < Shape> Shape là một giao diện giữ phương pháp bốc thăm() getArea() hoặc bất kỳ khác. Có nhiều lớp thực hiện Hình dạng, hình tròn, hình chữ nhật, hình vuông, v.v.

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