Thân gửi bạn nhc,
Xin được thảo luận với bạn thêm 1 chút:
1) Trước hết tui xin nhìn nhận là nếu cài đặt thẳng các cách move vô ở lớp Rùa và lớp Thỏ là rất dở vì không mở rộng được (tui đã đọc phần trả lời cuối cùng của bạn ở cái thread kia)
2) Cách lập các lớp cho các cách move như bạn là mở rộng được (thêm 1 kiểu move mới, 2 con vật nào đó có thể có cùng 1 kiểu move nào đó)
3) percentageOfTime không nên để ở trong lớp Move/Hop/Slip/.... mà nên để ở trong lớp Rùa và lớp Thỏ: con vật A có thể có cách move X với percentageOfTime là y% và con vật B khác có thể có cùng cách move X nhưng với z% (khác với y%)
3) Để mở rộng được (thêm 1 kiểu move mới, 2 con vật nào đó có thể có cùng 1 kiểu move nào đó) mình có thể làm cách khác:
a) định nghĩa enum MoveType = HOP (0), SLIP (1), Sleep (2), ....
b) định nghĩa lớp Animal với thuộc tính validMoves, phương thức ActualMove và Move:
Code:
Animal::validMoves: list hoặc mảng (các phần tử là kiểu enum MoveType)
Animal::ActualMove(move_type) {
switch (move_type) {
case HOP: position = .....
.......
}
}
Animal::Move {
idx = random(1 .. nValidMoves);
move_type = ValidMoves[idx];
ActualMove(move_type);
}
c) Lớp Rùa và lớp Thỏ thừa kế từ lớp Animal
Rùa::validMoves = (SLIP, ...); (đặt dòng này trong constructor của lớp Rùa)
Thỏ::validMoves = (HOP, ...); (đặt dòng này trong constructor của lớp Thỏ)
Như vậy:
- lớp Animal/Rùa/Thỏ có thuộc tính position
- thuộc tính position được thay đổi bởi phương thức Move (move là 1 hành xử (behavior) tác động lên thuộc tính position: theo tinh thần của OOP)
- dễ dàng thêm 1 loại Animal mới (thêm lớp Gà; khởi tạo Gà::validMoves trong constructor của lớp Gà), dễ dàng thêm 1 loại move mới (thêm phần tử HIPHOP vô enum MoveType; thêm "case HIPHOP" vô switch (chỉ thêm ở 1 chỗ trong Animal::ActualMove)), dễ dàng cho 2 loại animal xài chung 1 loại move nào đó (thêm loại move này khi khởi tạo validMoves trong 2 lớp ứng với 2 loại animal này)
(enum MoveType chỉ được xài ở 2 chỗ: định nghĩa của enum & switch trong Animal::ActualMove()
=> dễ sửa code
cài đặt cho các loại move khác nhau nằm tập trung ở 1 cái switch => dễ kiểm tra & dễ sửa)
(hiểu biết nông cạn; có gì sai sót mong được góp ý; xin cám ơn)
-thân