2016-12-01 16 views
5

Tôi có một tập hợp các lớp thực hiện cùng một phương thức kinh doanh. Tôi dự định sử dụng CRTP thay vì công văn ảo vì lý do hiệu suất. Nhưng tôi muốn giữ sự tiện lợi của mã hóa cho một giao diện duy nhất đi kèm với các phương thức thừa kế và ảo. Có thể có các lớp chuyên biệt của tôi kế thừa từ cả lớp trừu tượng được sử dụng để sử dụng CRTP để giữ mã chung, và cũng thừa kế từ lớp ảo thuần túy để tôi có thể tạo các cá thể của từng loại nhưng có mã khách hàng của tôi chỉ phụ thuộc vào giao diện? Thậm chí tốt hơn, làm thế nào tôi có thể sử dụng CRTP để cung cấp một giao diện duy nhất cho mã máy khách trong khi có nhiều triển khai?Sử dụng CRTP với giao diện

+0

Vâng, nếu bạn có kế hoạch tái cấu trúc mã do lý do hiệu suất thì phương pháp trừu tượng không phải là ý tưởng hay ... Bạn sử dụng CRTP để tránh công văn ảo lý do tại sao tên thay thế phổ biến của nó là đa hình tĩnh .. Tất nhiên từ cú pháp của quan điểm không ai có thể ngăn cản bạn làm điều này, nhưng IMHO bạn cần phải suy nghĩ qua ... –

+0

Các phương pháp công cộng sẽ không có trong giao diện, chỉ trong các chuyên ngành. – ruipacheco

Trả lời

5

Chắc chắn. Bạn có thể sử dụng cách tiếp cận như thế này, điều này hoàn toàn hợp lệ:

class Interface 
{ 
public: 
    virtual void doSomething() = 0; 
    //... 
}; 

template<typename T> 
class GeneralImpl : public Interface 
{ 
public: 

    void doSomething() override 
    { 
     auto someDetail = T::somethingStatic(); 
     //... 
     static_cast<T*>(this)->someMember(); 
     //... 
    } 
} 

class SpecificImpl : public GeneralImpl<SpecificImpl> 
{ 
public: 
    static int somethingStatic() 
    { 
     //... 
    } 

    void someMember() 
    { 
     //... 
    } 
}; 

int main() 
{ 
    std::vector<Interface*> vec; 
    SpecificImpl instance; 

    //... 

    vec.push_back(&instance); 

    //... 

    for(auto* inst : vec) { 
     inst->doSomething(); 
    } 

    //... 
} 
+0

Chi phí thời gian chạy có giống như chỉ sử dụng các hàm ảo thuần túy không? – ruipacheco

+0

Có, vì các mẫu không có chi phí thời gian chạy. – Smeeheey

+0

Vì vậy, nhìn vào mã CRTP này sẽ không cho tôi nhiều khi so sánh với chỉ sử dụng các hàm ảo thuần túy? Tôi có cùng một hình phạt về hiệu suất? – ruipacheco

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