Parameterized class: mỗi specialization có type và trạng thái static riêng
Tiên quyết
Sau bài này bạn sẽ
- Phân biệt type/value parameter với constructor argument
- Kiểm conversion theo element type được chọn
- Quan sát static property riêng cho hai specialization
Một container cần nhiều type nhưng không thể bỏ kiểm width
Box giữ hai phần tử. Box int và Box byte cùng dùng source định nghĩa, nhưng phép lưu 300/511 có kết quả khác. Generic code không làm mọi type có cùng miền giá trị hoặc cùng phép toán hợp lệ.
Type parameter quyết định element type
Box #(type T=int, int N=2) định nghĩa values theo T và N. Typedef IntBox dùng int, ByteBox dùng bit 8; main cấp phát object từ hai specialization này. T không phải một property có thể đổi type lúc runtime.
Value parameter khác constructor input
N quyết định fixed-array size trong class specialization; bài chỉ chạy N=2. Constructor khởi tạo từng phần tử 0 và tăng static counter. Muốn một buffer resize runtime cần thiết kế storage khác, không sửa N trong một object đã tạo.
ByteBox giữ byte đã conversion trước khi cộng
IntBox nhận 300/511 nên sum 811. ByteBox nhận explicit 8 bit casts, giữ 44/255 nên sum 299. Sum trả int nên không tự thu hẹp tổng 299 về 8 bit; phải xét type ở từng điểm assignment và return.
Static count không gộp mọi specialization
Main tạo hai IntBox và một ByteBox. IntBox.created phải 2, ByteBox.created phải 1. Không suy classname chung trong source có nghĩa chỉ có một counter cho toàn bộ type/value parameter combinations.
Hai object cùng specialization vẫn có dữ liệu riêng
A nhận hai giá trị, B mới tạo vẫn sum 0. A và B chia sẻ static counter của IntBox nhưng không chia sẻ values. Đây là hai trục khác nhau: specialization chọn type, instance chọn object storage.
Type hợp lệ chưa chắc dùng được với mọi method generic
Method sum trong bài cast element về int. Bài không hứa Box string, class handle hoặc real có cùng semantics, không kiểm N 0/negative, invalid index hoặc overflow. Mutation byte đầu 44→45 bị assertion parameter specialization width, storage or static scope bắt.
Hai specialization và ba object
Expected trước chạy: int_sum811,byte_sum299,untouched 0,int_created2,byte_created1,byte_bits8. Không thay expected bằng kết quả conversion tình cờ quan sát; tính 300 mod 256=44 và 511 mod 256=255 trước chạy.
Tự kiểm tra
Ghi contract cho từng specialization được hỗ trợ
Liệt kê T/N được dùng, conversion tại API và ý nghĩa counter. Test nhiều object cùng specialization và nhiều specialization khác nhau. Một class generic compile cho một type không chứng minh mọi type parameter đều được hỗ trợ.
Nguồn và mức độ đối chiếu
- SystemVerilog Parameterized Classes — bản chụp resources.zip, Nguồn đào tạo đã đọc. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b5.param-class, Bằng chứng thực nghiệm. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Class handles, inheritance, virtual methods, access and parameterization. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thí nghiệm nguyên bản ex.b5.param-class, Source, self-checks, verification.json và mutation/capability probes. Trích dẫn; nguồn đã đọc toàn văn.
- SystemVerilog Parameterized Classes — bản chụp resources.zip, Syntax; Parameterizing a Value (Size); Parameterizing a Data Type. Trích dẫn; nguồn đã đọc các mục liên quan.