2011-09-01 25 views
7

Tôi đang cố gắng viết một trò chơi bóng đơn giản, và có nhiều lượt (ví dụ: bóng cuộc sống). Bóng "chết" khi nó đi qua biên dưới cùng của màn hình. Những gì tôi có tác phẩm cho đến nay, nhưng dường như không phải là cách thích hợp để làm những việc:Đối tượng có thể tự xóa không? Làm sao?

if (ball.getY() > bottomOfScreen) { 
    ball.die(); 
    remove(ball); 
} 

Các die() phương pháp cơ bản mất dần màu sắc của quả bóng chậm (dark_gray -> tạm dừng (50) -> light_gray -> tạm dừng (50)), nhưng không thực sự làm bất cứ điều gì hữu ích.

Xóa(), hiển nhiên, loại bỏ bóng khỏi màn hình, đó là những gì tôi muốn. Nó có ý nghĩa với tôi cho việc này remove() là một phần của phương thức die() của Ball, trái với nó là một lời gọi phương thức riêng biệt trong chương trình chính - nhưng tôi không chắc chắn làm thế nào để đi về điều này?

Đối tượng có thể tự xóa không? Và, nếu nó có thể, là đối tượng tự tử tốt hơn so với giết người đối tượng, từ một quan điểm triết học/phương pháp luận?

Cảm ơn!

+0

Chỉ đề xuất. Việc loại bỏ đầu tiên phải đảm bảo rằng bóng chết, nếu không có sau đó gọi vào nó phương pháp chết() và sau đó loại bỏ nó. –

Trả lời

4

Đối tượng có thể tự xóa vì nó có một số tham chiếu đến cơ chế hiển thị chế độ xem. mẫu của bạn không cung cấp đủ thông tin nên tôi sẽ minh họa một cách để làm điều đó:

public class Ball { 
    private ViewRenderer view; 

    public void remove() { 
     view.remove(this); 
    } 
} 

Cả tự tử cũng không giết người là tốt hơn hoặc tồi tệ hơn. Nó phụ thuộc vào thiết kế và yêu cầu của bạn.

Trong ví dụ này, mặc dù giết người có thể là một lợi thế từ cách này Ball đối tượng không cần phải biết trong đó bối cảnh nó đang được sử dụng.

+1

Xin lỗi tôi phải downvote điều này. Nó sẽ làm việc, nhưng nó giới thiệu một tham chiếu vòng tròn - Ball có tham chiếu đến ViewRenderer, và (có lẽ) ViewRenderer là một tham chiếu đến Ball. Những thứ như vậy sẽ làm cho thử nghiệm phức tạp hơn nhiều so với những gì chúng cần. – DJClayworth

+0

Cảm ơn bạn đã giải thích lý do của mình. Bạn đúng, mặc dù trong một tình huống phức tạp hơn (ví dụ: sử dụng mẫu MVC/Observer) đối tượng có thể yêu cầu xóa, ví dụ: thông qua trình xử lý thay đổi thông thường. –

2

Trong ý nghĩa xóa đối tượng khỏi bộ nhớ: không, trong Java chỉ được xử lý bởi bộ thu gom rác.

Điều bạn có thể làm là xóa đối tượng khỏi bộ sưu tập chứa nó, nhưng điều này sẽ yêu cầu đối tượng có quyền truy cập vào các bộ sưu tập đó (trong hầu hết các trường hợp sẽ không khả thi vì có thể có nhiều bộ sưu tập).

Tôi muốn đề xuất đối tượng chứa (màn hình trong trường hợp của bạn) để thăm dò trạng thái của đối tượng chứa (bóng) và xóa nó sau khi thực sự chết.

3

Có thể tạo ra một phương pháp mà bóng tự loại bỏ, nhưng đó là điều xấu. Để xóa chính nó khỏi màn hình, Bóng phải có tham chiếu đến màn hình. Điều này tạo ra một chuỗi tham chiếu vòng tròn (Ball có tham chiếu đến màn hình, màn hình có tham chiếu đến Ball), điều này sẽ làm cho thiết kế của bạn phức tạp hơn và thử nghiệm của bạn phức tạp hơn nhiều.

Tự sát là tốt - màn hình yêu cầu bóng chết và bóng chết. Nhưng đây là về việc loại bỏ một mối quan hệ, không chết. Điều duy trì mối quan hệ là màn hình, và vì vậy nó phải là điều làm việc loại bỏ.

Cũng nên nhớ rằng cả hai không nhất thiết phải xảy ra cùng nhau. Màn hình có thể muốn giữ một quả bóng chết xung quanh vì lý do nào đó, và nó có thể muốn loại bỏ một quả bóng không chết. Ngay cả khi điều đó không xảy ra trong ứng dụng của bạn ngay bây giờ, hãy cho phép khả năng này.

1

Có thể có một số đối tượng (ví dụ:màn hình, hoặc ViewRenderer trong ví dụ của Johan) chứa một tham chiếu đến Ball, và loại bỏ tham chiếu này phải được thực hiện bởi Screen ("đối tượng giết người"). "Đối tượng tự tử" số tiền để Ball đi qua một tin nhắn đến màn hình yêu cầu được "sát hại".

Vì nó là Bóng biết khi nó đã vượt qua ranh giới, nó có ý nghĩa với tôi (mà không biết chi tiết về thiết kế của bạn) để loại bỏ được bắt đầu bởi Ball. Sau đó, Màn hình có thể tìm hiểu về sự thay đổi này bằng một trong nhiều cách:

  • Màn hình có thể thăm dò bóng.
  • Bóng có thể giữ tham chiếu ngược trực tiếp vào Màn hình, điều này tạo ra sự phụ thuộc tròn không may.
  • Bóng có thể giữ tham chiếu đến màn hình qua giao diện BallObserver. Đây là một ứng dụng của observer pattern.

Đầu tiên là đơn giản nhất, và điều này làm cho nó trở thành lựa chọn tốt nếu nó phù hợp tự nhiên với cơ chế của bạn để vẽ màn hình. Thứ ba là linh hoạt hơn về nguyên tắc, nhưng bạn có thể không cần sự linh hoạt này trong thực tế. Tùy chọn ở giữa có thể là OK trong một chương trình đơn giản, nhưng có lẽ bạn nên xem xét nó như là một bước trên đường đến bước thứ ba.

Và nếu bạn không có đối tượng Screen (hoặc ViewRenderer hoặc bất kỳ) và thực sự có nghĩa là "một cuộc gọi phương thức riêng trong chương trình chính" thì có thể bạn nên xem xét lại thiết kế của mình.

0

Không, các đối tượng không thể tự tử. Bất kỳ tham chiếu nào của chính nó chỉ là một tham chiếu.

Để "xóa" đối tượng trong chính nó, người ta chỉ xóa tất cả các biến mẫu.

Để "xóa" đối tượng bên ngoài, người ta sẽ đặt biến bằng null.

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