2012-10-16 34 views
5

Tôi có câu hỏi về mã mà tôi vừa mới nắm trong tay. Tôi chỉ muốn biết nếu trong C++ mẫu mô hình đó là đúng hay hữu ích để làm thừa kế sau (chỉ cần 3 lớp là một ví dụ):Thừa kế từ một mẫu C++


template< class I, class P, class D, unsigned int ID = 0 > 
class PathFilter : public Filter< I, P, 1 > 
{ 
... 
} 

template< class I, class A, unsigned int N = 1 > 
class Filter : public Algorithm< I, A > 
{ 
... 
} 

template< class I, class A > 
class Algorithm : public A //This line 
{ 
    ... 
} 

Câu hỏi của tôi đặc biệt về thừa kế trong ví dụ thứ ba. Nó có hữu ích để làm cho nó 'chung' và không chính xác? Đó là một lựa chọn tốt để thỏa hiệp mã dễ hiểu bằng một mã chung hơn? Tôi yêu cầu trước hết bởi vì tôi không phải là một chuyên gia trong các mẫu C++, nhưng cũng bởi vì tôi thấy mã này khó hiểu bằng cách sử dụng các mẫu (thường là tên của các mẫu không nói gì về nội dung của nó). Lời khuyên nào?

Trả lời

2

Những gì bạn đang làm là một lớp hỗn hợp (đặc biệt, lớp học của bạn Algorithm là một trong số đó).

Để tham khảo, bạn có thể tham khảo, ví dụ: http://en.wikipedia.org/wiki/Mixin hoặc http://en.wikipedia.org/wiki/Composite_pattern.

Thật vậy, bạn đang chỉ định "chức năng nhất định (được chỉ định bởi A) sẽ được thừa kế hoặc chỉ được sử dụng lại bởi một lớp con (ví dụ: Algorithm)". (cit. từ bài viết đầu tiên)

Nói cách khác, bạn đang làm cho chính mình (hoặc người dùng của bạn) tự do thêm hoặc thay đổi hành vi thành Algorithm bằng cách nào đó "sau đó". Lợi ích thực sự của bạn là đạt được sự linh hoạt như vậy chỉ dựa vào trình biên dịch chứ không phải trên một số cơ chế ràng buộc động (ví dụ: ghi đè các chức năng ảo). lớp cuối cùng của bạn Algorithm<A>, trên thực tế, được xây dựng tại thời gian biên dịch và nó là thể hiệu quả như lớp bạn đã có thể thu được bằng văn bản Algorithm<A> một cách rõ ràng (ví dụ rõ ràng bao gồm các chính sách A trong Algorithm viết nó bằng tay).

EDIT:

Tôi cũng xin đề nghị để đưa ra một cái nhìn trang này wikipedia về chính sách thiết kế dựa (http://en.wikipedia.org/wiki/Policy-based_design).

Ở đó, tên chính sách (số A) của bạn xuất hiện ở dạng rõ ràng, có tên rõ ràng, được thông báo một cách khôn ngoan bởi @ full.stack.ex.

+1

Vì vậy, nếu đó là những gì bạn muốn, tốt. Để dễ đọc, đúng, có một truyền thống đặt tên cho các tham số mẫu một cách kỳ lạ - I, P, A, v.v. Nhưng bạn không phải :). Cung cấp cho họ tên tốt hơn và họ có thể trở nên tự mô tả. –

+1

Cảm ơn câu trả lời của bạn, nhưng tôi vẫn có một câu hỏi. Tôi hiểu việc sử dụng định nghĩa chung và trừu tượng của một số chức năng trong một lớp "cao hơn". Nhưng mục tiêu chính của một mẫu không phải là để khái quát hóa các kiểu tham số? Vì vậy, những gì tôi nói cuối cùng là tôi có thể vượt qua hầu như tất cả mọi thứ để lớp này cao hơn và bảo tồn một chức năng phân cấp thấp hơn. Cuối cùng, tôi sẽ có một tập hợp các đối tượng rất hạn chế có thể kế thừa (có thể một) các hàm thấp hơn, tôi có sai không? Nó không phải là một cách không thực tế để xác định rằng genericity? –