2016-03-15 15 views
7

Hãy một thư viện chứa các hệ thống phân cấp lớp sau đây:C++ - Đặt các thành viên chung cho hai lớp tiểu

class LuaChunk 
{ 
}; 

class LuaExpr : public LuaChunk 
{ 
}; 

class LuaScript : public LuaChunk 
{ 
}; 

Bây giờ tôi muốn sử dụng thư viện này trong ứng dụng của tôi bằng cách mở rộng hai loại cổ phiếu này:

class AppLuaExpr : public LuaExpr 
{ 
private: 

    Foo * someAppSpecificMemberFoo; 
    Bar * someAppSpecificMemberBar; 
}; 

class AppLuaScript : public LuaScript 
{ 
private: 

    Foo * someAppSpecificMemberFoo; 
    Bar * someAppSpecificMemberBar; 
}; 

Vấn đề ở đây là, nếu tôi có nhiều thành viên, mỗi người trong số họ có cặp getter/setter riêng, nó sẽ tạo ra rất nhiều sự sao chép mã.

Có cách nào, không sử dụng nhiều thừa kế (mà tôi muốn tránh) để đặt chung các công cụ dành riêng cho ứng dụng có trong cả hai AppLuaExprAppLuaExpr?

Tôi đã xem xét các mẫu thiết kế cấu trúc hiện có được liệt kê trên Wikipedia, nhưng dường như không có mẫu nào được điều chỉnh phù hợp với vấn đề của tôi.

Cảm ơn bạn.

+2

Cách sử dụng * composition *? Tạo một lớp học với các thành viên và mã phổ biến của bạn, và thêm nó như là một thành viên của các lớp cụ thể của bạn? – Louen

+0

@Louen Cảm ơn sự giúp đỡ của bạn. Có vẻ như đó là một lựa chọn. Bạn có ý tưởng nào khác không? – Virus721

+0

@songyuanyao Không, tôi không thể làm điều đó. Như tôi đã đề cập, 3 lớp đầu tiên được mô tả ở trên nằm trong thư viện mà tôi không thể thêm nội dung cụ thể cho ứng dụng vào, nếu không nó không còn là thư viện nữa. – Virus721

Trả lời

5

Bạn có thể thể hiện dữ liệu chung là lớp của riêng mình và truyền dữ liệu đó trong khi xây dựng. Bằng cách đó bạn có thể gói gọn mọi thứ bằng cách sử dụng bố cục.

class Core { }; 

class Component { 
    int one, two; 
public: 
    Component(int one, int two) : one(one), two(two) 
    {} 
}; 

class Mobious : public Core 
{ 
    Component c; 
public: 
    Mobious(Component &c) : Core(), c(c) { } 
}; 

class Widget : public Core 
{ 
    Component c; 
public: 
    Widget(Component &c) : Core(), c(c) 
    {} 
}; 

int main(void) 
{ 
    Widget w(Component{1, 2}); 
    Mobious m(Component{2, 3});; 
    return 0; 
} 
+0

Cảm ơn sự giúp đỡ của bạn. Tôi nghĩ rằng sự kết hợp là những gì tôi sẽ sử dụng. – Virus721

+0

@ Virus721 Nếu có phụ thuộc chỉ được khởi tạo một lần nhưng được sử dụng trong cả hai lớp, hãy xem xét sử dụng 'shared_ptr' (con trỏ thông minh) để diễn tả điều đó. Điều này giúp đảm bảo rằng một tài nguyên chỉ được khởi tạo và hủy một lần trong ứng dụng của bạn. – Johannes

+1

@ Virus721 Đối với hồ sơ, điều này sử dụng * composition * (chức năng đại biểu cho một lớp bằng cách sử dụng các thành viên) cùng với * đảo ngược điều khiển * (chuyển lớp được ủy quyền đến trong một hàm tạo). – MicroVirus

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