Một tìm kiếm nhanh của stackexchange này cho thấy rằng trong thành phần chung thường được coi là linh hoạt hơn so với thừa kế nhưng như mọi khi nó phụ thuộc vào dự án, v.v. và đôi khi sự kế thừa là sự lựa chọn tốt hơn. Tôi muốn làm một trò chơi cờ vua 3D trong đó mỗi quân cờ có một lưới, có thể là hoạt hình khác nhau, v.v. Trong ví dụ cụ thể này, có vẻ như bạn có thể tranh luận một trường hợp cho cả hai cách tiếp cận, tôi có sai không?
Kế thừa sẽ trông giống như thế này (với hàm tạo thích hợp, v.v.)
class BasePiece
{
virtual Squares GetValidMoveSquares() = 0;
Mesh* mesh;
// Other fields
}
class Pawn : public BasePiece
{
Squares GetValidMoveSquares() override;
}
mà chắc chắn tuân theo nguyên tắc "is-a" trong khi thành phần sẽ trông giống như thế này
class MovementComponent
{
virtual Squares GetValidMoveSquares() = 0;
}
class PawnMovementComponent
{
Squares GetValidMoveSquares() override;
}
enum class Type
{
PAWN,
BISHOP, //etc
}
class Piece
{
MovementComponent* movementComponent;
MeshComponent* mesh;
Type type;
// Other fields
}
Đây có phải là vấn đề sở thích cá nhân hay một cách tiếp cận rõ ràng là một lựa chọn thông minh hơn so với phương pháp khác ở đây?
EDIT: Tôi nghĩ rằng tôi đã học được điều gì đó từ mỗi câu trả lời vì vậy tôi cảm thấy tồi tệ khi chỉ chọn một. Giải pháp cuối cùng của tôi sẽ lấy cảm hứng từ một số bài viết ở đây (vẫn đang làm việc trên nó). Cảm ơn mọi người đã dành thời gian trả lời.
var Pawn = new Piece(howIMove, howITake, whatILookLike)
có vẻ đơn giản hơn, dễ quản lý hơn và dễ bảo trì hơn so với hệ thống phân cấp thừa kế.