Tôi đang viết một trình mô phỏng có một số giao diện mà tất cả các đối tượng mô phỏng thực hiện. Giao diện Entity
có các phương thức mà tất cả các đối tượng phải có, chẳng hạn như truy xuất ID và tiến hành bước thời gian cho trạng thái của đối tượng. Collidable
mở rộng Entity
và đại diện cho bất kỳ thứ gì có khối lượng và vị trí cần được xem xét khi thuật toán phát hiện xung đột chạy. Field
mở rộng Entity
và đại diện cho bất kỳ thứ gì bản đồ vị trí thành giá trị; chúng được sử dụng để mô hình hóa những thứ như từ trường thấm vào thế giới nhưng không có khối lượng hoặc dạng vật lý. RigidBody
là một lớp thực hiện Collidable
và cung cấp các thuật toán động lực học cứng nhắc. Tôi có một lớp học World
quản lý tất cả Entities
và có phương pháp để thúc đẩy đồng hồ của trình mô phỏng và phân vùng thế giới để phát hiện va chạm hiệu quả hơn.Mô hình tốt để lưu trữ triển khai của một giao diện và truy xuất các triển khai cụ thể là gì?
Vấn đề của tôi liên quan đến việc truy xuất Entity
loại phụ từ World
. Ban đầu, World
vừa có bản đồ là Entities
được khóa bằng ID và để lấy Field
hoặc RigidBody
sẽ có các phương pháp lấy Entity
ra khỏi bản đồ và thực hiện kiểm tra instanceof
cộng với dàn diễn viên phụ. Tôi nhận thức rõ rằng việc sử dụng instanceof
không được chấp nhận, tuy nhiên, vì vậy tôi đã thử một cách tiếp cận khác.
Hiện tại, tôi có bản đồ riêng trong phạm vi World
cho mỗi giao diện. Ví dụ: có bản đồ cho Collidables
cũng như bản đồ cho tất cả Entities
. Phương thức addCollidable()
sẽ thêm vào cả hai bản đồ và getCollidable()
sẽ chỉ truy xuất từ bản đồ Collidable
. Điều này tránh instanceof
, nhưng nó vẫn có vẻ như thiết kế kém cho tôi. Nếu tôi mơ lên một giao diện khác để mở rộng Entity
, tôi sẽ cần một bản đồ khác trong World
và các phương thức tương ứng.
Tôi cảm thấy vấn đề này không quá tối nghĩa, vì vậy điều gì thường được thực hiện trong trường hợp này?
EDIT
Tôi không tin rằng mô hình khách sẽ làm việc ở đây, khi khách cho phép bạn để gửi vào loại bê tông, và một số các phương pháp phục hồi của tôi cần phải lấy loại giao diện. Ví dụ: Khách truy cập sẽ làm việc nếu World
chỉ các phương thức cần thiết để truy xuất RigidBodies
và các lớp cụ thể khác, nhưng tôi không thể tạo phương thức truy xuất tất cả Collidables
với Khách truy cập.
Bạn có thể có một cái gì đó như ' T getEntityFromMap (Clase clazz)', phương pháp này loại bỏ sự cần thiết của bản đồ 'Collidables', và bạn chỉ cần yêu cầu' getEntityFromMap (Entity.class) 'để có được một Thực thể trong trường hợp chung nhất của nó, và .... –