Jeff, tôi nghĩ bạn có trực giác đúng: tùy theo điều đó.
Phân cấp lớp hướng đối tượng với phương thức ảo là tốt khi bạn có một bộ phương pháp tương đối cố định cần được triển khai, nhưng nhiều lớp con tiềm năng có thể kế thừa từ gốc của cấu trúc phân cấp và triển khai các phương thức đó. Trong một thiết lập như vậy, tương đối dễ dàng để thêm các lớp con mới (chỉ cần thực hiện tất cả các phương thức), nhưng tương đối khó thêm các phương thức mới (bạn phải sửa đổi tất cả các lớp con để đảm bảo chúng thực hiện đúng phương thức mới).
Loại dữ liệu có chức năng dựa trên đối sánh mẫu là tốt khi bạn có một nhóm lớp tương đối cố định thuộc về kiểu dữ liệu, nhưng có nhiều chức năng hoạt động trên loại dữ liệu đó. Trong một thiết lập như vậy, việc thêm chức năng mới cho kiểu dữ liệu tương đối dễ dàng (chỉ khớp mẫu trên tất cả các lớp của nó), nhưng tương đối khó thêm các lớp mới là một phần của kiểu dữ liệu (bạn phải sửa đổi tất cả các hàm phù hợp trên kiểu dữ liệu để đảm bảo chúng hỗ trợ đúng lớp mới).
Ví dụ kinh điển cho cách tiếp cận OO là lập trình GUI. Các yếu tố GUI cần hỗ trợ rất ít chức năng (vẽ bản thân trên màn hình là tối thiểu), nhưng các phần tử GUI mới được thêm vào mọi lúc (các nút, bảng, biểu đồ, thanh trượt, vv). Ví dụ kinh điển cho cách tiếp cận đối sánh mẫu là trình biên dịch. Ngôn ngữ lập trình thường có cú pháp tương đối cố định, vì vậy các phần tử của cây cú pháp sẽ thay đổi hiếm khi (nếu có), nhưng các hoạt động mới trên cây cú pháp liên tục được thêm vào (tối ưu hóa nhanh hơn, phân tích kỹ lưỡng hơn, vv).
May mắn thay, Scala cho phép bạn kết hợp cả hai cách tiếp cận. Cả hai trường hợp có thể là mẫu phù hợp và hỗ trợ gửi phương thức ảo. Các lớp thông thường hỗ trợ việc gửi phương thức ảo và có thể là mẫu khớp nhau bằng cách xác định một trình trích xuất trong đối tượng đồng hành tương ứng. Việc lập trình viên quyết định khi nào mỗi phương pháp phù hợp, nhưng tôi nghĩ cả hai đều hữu ích.
Nguồn
2009-02-19 09:17:52
Liên kết Beust bị hỏng, dường như làm thay đổi lược đồ URL. Tôi đã cố gắng xem liệu tôi có thể tìm ra bài đăng nào được dự định không, nhưng tôi không chắc chắn. Vui lòng cung cấp liên kết đã sửa hoặc một số thông tin khác để tiếp tục (tiêu đề của bài đăng là gì?). –