2012-07-17 44 views
7

Điểm duy nhất trong việc thực hiện trường hợp thứ hai là nếu tôi muốn lấy được từ một Collidable mà không phải là một đối tượng? Nếu đó là trường hợp, khi nào là trường hợp đầu tiên bao giờ thuận lợi kể từ khi trường hợp thứ 2 cung cấp sự linh hoạt hơn.Loại thừa kế nào thích hợp hơn?

Cả hai collidables chỉ có một chức năng ảo tinh khiết và Object là một lớp cơ sở cho các đối tượng có thể được vẽ trên màn hình (trong trường hợp của tôi).

^Giả sử tôi hiểu đoạn mã sau chính xác (Tôi không quá chắc chắn TBH)

class Object 
class CollidableObject : Object 
class Actor : public CollidableObject 

class Object 
class Collidable 
class Actor : public Object, public Collidable 

Edit:

Dựa trên Matt/Seth

class Object 
class Collidable 
class Clickable 
class Trackable 
class BlowUppable 
class Actor : public Object, public Collidable, public Clickable, public Trackable, 
       public BlowUppable 

class SomeObjectThatIsTakenForGrantedThatEverythingElseIsInherited : public Actor 

dụ đầu tiên là trường hợp thứ hai và ví dụ thứ hai là trường hợp đầu tiên. Tôi đoán đó là sử dụng duy nhất tôi thấy cho trường hợp đầu tiên.

@Luchian
Đây sẽ là một câu hỏi khác với câu hỏi gốc từ thư trả lời của bạn.

Trong trường hợp này, có sự khác biệt nào đang thay đổi một đối tượng từ mối quan hệ-a đến mối quan hệ có-a không? Trong mỗi trường hợp, để kiểm tra va chạm, một đối tượng phải có một lá cờ để biết liệu có nên kiểm tra va chạm hay không. Trong trường hợp của bạn, các thành viên có thể được kiểm tra nếu nó null hay không, nhưng trong trường hợp có nguồn gốc, đối tượng chính nó cho biết liệu nó có thể va chạm hay không. Trong một mảng/cây, tôi có thể truyền đối tượng dẫn xuất dưới dạng đối số hoặc chuyển hitbox làm đối số bằng cách sử dụng phương thức get().

Để được nhiều hơn trong chiều sâu, tôi có một lớp khác - sử dụng trường hợp thứ hai

class Hitbox : public Object, public Collidable 

và lớp diễn viên có nó như là một thành viên

class Actor : public Object 
{ 
    Hitbox *box; 
}; 

Đối tượng có va chạm sẽ có một hitbox thay vào đó và điều này thể hiện chính xác bài đăng của bạn mà tôi nghĩ. Nhưng những gì vẫn nhận được tôi là khi tôi xem lại ví dụ của bạn một lần nữa, có nghĩa là Hitbox nên có một thành viên Collidable thay thế?

class Hitbox 
{ 
    Collidable *collision; 
}; 

Những gì tôi có:
Một diễn viên giữ một Hitbox mà xử lý va chạm

gì Hitbox nên làm:
Kế thừa Collidable hoặc
Có Collidable như một thành viên

diễn viên đã được sau quy ước của bạn. Hitbox có nên làm như vậy không?

Trả lời

2

Tôi sẽ làm trường hợp thứ hai, là ObjectCollidable là các mối quan tâm chéo. Nếu bạn đi theo tuyến đường CollidableObject, có thể bạn sẽ kết thúc với một vụ nổ tổ hợp các lớp học. Nó sẽ không được lâu cho đến khi bạn nhìn thấy một CollidableTrackableClickableBlowuppableObject.

Collidable là ảo thuần, nó được sử dụng trong trường hợp này làm giao diện, vì vậy không có nhiều lời chỉ trích tranh luận về đa kế thừa. Bạn chỉ đơn giản nói rằng một diễn viên thực hiện giao diện Collidable.

+0

Bạn sẽ không phải có 'CollidableTrackableClickableBlowuppableObject' nếu bạn đã thực hiện thao tác đầu tiên; nó chỉ là một lớp được thừa kế từ 'Collidable', 'Trackable',' Clickable', và 'Blowuppable', giống như cách đầu tiên, nhưng bạn sẽ không kế thừa' Object' như cái đầu tiên. Tôi không chắc liệu người đầu tiên có hữu ích hơn hay không; không phải tất cả 'Clickable' có thể vẽ được trên màn hình không? Nếu bạn có tất cả chúng là riêng biệt, bạn không thể biết liệu 'Object' của bạn có thể nhấp được hay không nếu bạn có thể click' Clickable'. Với cách thứ hai, bạn biết rằng 'Có thể nhấp' có thể vẽ được. –

+1

Bạn sẽ không phải có ... nếu bạn đã làm _second_ tôi muốn nói. –

1

Đây là kịch bản hoàn hảo cho số strategy pattern. Đây là nơi mà ngôn ngữ tiếng Anh chơi thủ đoạn trên tâm trí của chúng tôi và làm cho chúng ta nghĩ rằng CollidableObject là một đối tượng hợp lệ để có trong hệ thống phân cấp này. Tôi nói va chạm là một hành vi nhiều hơn một đối tượng, vì vậy tôi sẽ đi với cả hai.

thích phần cho việc này:

class Object 
{ 
    CollidableBehavior* collisionBehavior; 
} 
class Actor : Object 
{ 
    // collisionBehavior = new ActorCollision() 
} 

class AClassThatDoesntCollide 
{ 
    // collisionBehavior = NULL 
} 
+0

Nếu hành vi va chạm phụ thuộc vào các chi tiết cụ thể của lớp diễn viên, điều này sẽ không thực tế lắm. Mặt khác, nếu nó là một thuộc tính độc lập, điều này có ý nghĩa tốt. –

0

là điểm duy nhất trong việc thực hiện các trường hợp thứ 2 là nếu tôi muốn lấy từ một Collidable mà không bị một đối tượng?

Có, trường hợp thứ hai giúp bạn linh hoạt hơn vì nó cho phép tách các giao diện. Ví dụ, sau này bạn có thể muốn một đối tượng có thể va chạm được nhưng không thể vẽ được.

Trường hợp thứ 1 thuận lợi khi trường hợp thứ 2 cung cấp thêm linh hoạt.

Trường hợp thứ hai mang đến sự linh hoạt hơn nhưng thiết kế cũng phức tạp hơn. Cuối cùng, bạn sẽ cần thừa kế ảo và điều này khó xử lý hơn. Tuy nhiên, nếu các lớp cơ sở của bạn là trừu tượng thuần túy thì nó không phải là vấn đề.

Bạn có thể thấy this.

Các vấn đề liên quan