[Buổi 29][Đa hình][HW] Bài 4: Kênh thông báo đa hình
Kênh thông báo đa hình
Bối cảnh
Một notification engine có abstract Channel với cost(length) và label(). SMS tính 2*length, Email tính ceil(length/10), Push miễn phí. Với mỗi thông báo, runtime type của channel quyết định chi phí. Hệ thống cần in chi phí từng message, tổng chi phí và channel có tổng chi phí cao nhất; tie label tăng.
Bài Medium yêu cầu sau khi object channel được tạo, phase cost aggregation chỉ gọi virtual interface chứ không kiểm tra type tag lại.
Ở B29, sau khi runtime object đã được tạo, phase xử lý nên làm việc thông qua interface base. Nếu code tiếp tục if/switch theo type trong từng phép tính, polymorphism chưa thực sự được sử dụng. Base cần virtual destructor nếu object bị xóa qua base pointer, và collection phải tránh object slicing để dynamic type được giữ nguyên.
Ở B29, sau khi runtime object đã được tạo, phase xử lý nên làm việc thông qua interface base. Nếu code tiếp tục if/switch theo type trong từng phép tính, polymorphism chưa thực sự được sử dụng. Base cần virtual destructor nếu object bị xóa qua base pointer, và collection phải tránh object slicing để dynamic type được giữ nguyên.
Yêu cầu
- Base Channel virtual cost/label.
- Derived SMS/EMAIL/PUSH.
- Đọc n message.
- In từng cost, TOTAL, TOPCHANNEL.
Input
Dòng 1 n; n dòng S/E/P length.
Output
n dòng cost; rồi TOTAL và TOPCHANNEL.
Ràng buộc
1≤n≤5000, length≥0.
Ví dụ 1
Input
4
S 10
E 11
P 100
S 5
Output
20
2
0
10
TOTAL 32
TOPCHANNEL SMS 30
Giải thích
Chi phí là SMS10→20, Email11→2, Push→0, SMS5→10. Tổng32. Theo channel: SMS30, EMAIL2, PUSH0 nên TOPCHANNEL là SMS 30.
Mẫu này không chỉ kiểm tra giá trị số cuối mà còn kiểm tra dynamic dispatch. Cùng một call-site qua interface base phải chọn implementation đúng với runtime type. Nếu quên virtual, bị slicing hoặc giữ switch sai chỗ, output của một trong các loại object sẽ khác ngay ở bước trace này.
Ví dụ 2
Input
3
P 1
P 2
P 3
Output
0
0
0
TOTAL 0
TOPCHANNEL PUSH 0
Giải thích
Ba message đều Push nên từng cost0, total0. Chỉ channel PUSH xuất hiện nên TOPCHANNEL PUSH 0.
Mẫu này không chỉ kiểm tra giá trị số cuối mà còn kiểm tra dynamic dispatch. Cùng một call-site qua interface base phải chọn implementation đúng với runtime type. Nếu quên virtual, bị slicing hoặc giữ switch sai chỗ, output của một trong các loại object sẽ khác ngay ở bước trace này.
Thông tin học tập
- Module: M08
- Buổi: B29
- Loại bài: HOMEWORK
- Độ khó: Medium
- Concepts: abstract interface, virtual cost, polymorphic aggregation
- Giới hạn kiến thức: B01-B29
- Time limit: 1 second(s)
- Memory limit: 256 MB
- Point: 100
Comments