การค้นหาอย่างรวดเร็วของ stackexchange นี้แสดงให้เห็นว่าในองค์ประกอบทั่วไปโดยทั่วไปถือว่ามีความยืดหยุ่นมากกว่าการสืบทอด แต่เช่นเคยขึ้นอยู่กับโครงการ ฯลฯ และมีหลายครั้งที่การสืบทอดเป็นตัวเลือกที่ดีกว่า ฉันต้องการสร้างเกมหมากรุกสามมิติที่แต่ละชิ้นมีตาข่ายอาจเป็นภาพเคลื่อนไหวที่แตกต่างกันไปเรื่อย ๆ ในตัวอย่างที่เป็นรูปธรรมนี้ดูเหมือนว่าคุณสามารถโต้แย้งกรณีสำหรับทั้งสองวิธีฉันผิดหรือเปล่า?
การสืบทอดจะมีลักษณะเช่นนี้ (พร้อมตัวสร้างที่เหมาะสม ฯลฯ )
class BasePiece
{
virtual Squares GetValidMoveSquares() = 0;
Mesh* mesh;
// Other fields
}
class Pawn : public BasePiece
{
Squares GetValidMoveSquares() override;
}
ซึ่งแน่นอนว่าเป็นไปตามหลักการ "เป็น -a" ในขณะที่องค์ประกอบจะมีลักษณะเช่นนี้
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
}
มันเป็นเรื่องของการตั้งค่าส่วนตัวหรือเป็นวิธีหนึ่งที่ชัดเจนกว่าทางเลือกอื่นที่นี่หรือไม่
แก้ไข: ฉันคิดว่าฉันเรียนรู้บางสิ่งจากคำตอบทุกข้อดังนั้นฉันจึงรู้สึกไม่ดีที่เลือกเพียงหนึ่งข้อ ทางออกสุดท้ายของฉันจะได้รับแรงบันดาลใจจากโพสต์ต่างๆที่นี่ (ยังทำงานอยู่) ขอบคุณทุกคนที่สละเวลาตอบ
var Pawn = new Piece(howIMove, howITake, whatILookLike)
ดูเหมือนง่ายกว่าฉันจัดการและดูแลรักษาได้ง่ายกว่าลำดับชั้นการสืบทอด