Tôi chắc chắn điều này phải được yêu cầu trước nhưng tôi dường như không thể tìm thấy một ví dụ tương tự. Tôi hiểu rõ tính đa hình và phương pháp quá tải, nhưng đây là một kịch bản dường như đơn giản với một giải pháp thoát khỏi tôi:xử lý giống đa hình các tham số - OO đơn giản?
giả sử tôi có một lớp cơ sở với một số lớp dẫn xuất. Tôi sẽ sử dụng hình dạng ví dụ này
base Shape
derived Circle extends Shape
derived LineSeg extends Shape
, vv
Bây giờ, hình dáng có một phương pháp gọi là giao nhau (khác) rằng các xét nghiệm đối với hình dạng khác để xem nếu họ giao nhau. Với tính đa hình, dễ dàng thấy cách Circle, LineSeg, v.v. có thể thực hiện các phương thức "giao nhau" của riêng chúng, và với quá tải phương thức, tôi có thể dễ dàng thực hiện tất cả các kết hợp cần thiết. ví dụ,
Circle.intersect(LineSeg)
Circle.intersect(Circle)
LineSeg.intersect(Circle)
, vv
cho đến nay rất tốt.
vấn đề là, nếu tôi giữ một danh sách trung tâm của hình dạng, tôi muốn làm điều này:
for some shape s
Foreach shape in Shapes
if (s.intersect(shape)) - do something
Hiện nay, tôi không chắc chắn cách này là có thể, kể từ khi phương pháp quá tải chọn "giao nhau" để phù hợp với loại hình cơ sở, và không phải là kiểu tham số thích hợp. Làm thế nào tôi có thể thực hiện điều này mà không có một chuỗi nếu-else kiểm tra các loại và xuống đúc?
BTW, tôi đang sử dụng Java, nhưng tôi không chắc chắn rằng ngôn ngữ là hoàn toàn có liên quan vì nó có vẻ là một câu hỏi thiết kế cơ bản. Dường như đơn giản, tôi đang thiếu gì?
Cảm ơn!
Giải quyết bên dưới (Cảm ơn!), Xem chi tiết ở đó. Về cơ bản, bằng cách gọi lại trong các lớp dẫn xuất, sau đó gọi phương thức thích hợp (mẫu khách truy cập?), Bạn có thể sử dụng từ khóa "này" để gọi phương thức giao nhau thích hợp, vì nó có kiểu thích hợp cần thiết.
Một số ngôn ngữ lập trình hỗ trợ quá tải trực tiếp trên các loại đối số.Ví dụ, LISP hỗ trợ * multimethods *, và tôi cho rằng một số ngôn ngữ lập trình hàm hỗ trợ giống nhau. Trong Java, điều này thường được gọi là * double dispatch *, và mô hình GoF Visitor là con đường để đi. –
Không để nitpick thiết kế của bạn nhưng thừa kế của bạn là một chút sai. Phân đoạn đường không thực sự là hình dạng. Chúng tạo nên hình dạng. Bạn sẽ kiểm tra giao điểm của bất kỳ một trong nhiều, tùy thuộc vào hình dạng, các đoạn thẳng tạo thành hai hình dạng được đề cập :) – ChiefTwoPencils
@ C.Lang, bắt tốt, nhưng nếu tôi đổi tên lineSeg thành "wall" thì sao? thats về cơ bản nó được sử dụng như thế nào, nhưng gọi nó là lineSeg làm cho việc khái niệm hóa dễ dàng hơn bằng cách sử dụng nó theo các hình dạng phức tạp hơn – user1922401