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
Trả lời
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();
}
//...
}
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
Có, vì các mẫu không có chi phí thời gian chạy. – Smeeheey
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
- 1. biên dịch báo lỗi khi sử dụng CRTP với static_assert
- 2. C++ Compiler với CRTP
- 3. Sử dụng Gson với các loại giao diện
- 4. Sử dụng giao diện điều khiển maven với m2eclipse
- 5. Sử dụng mã vùng PHPUnit với giao diện
- 6. Cách sử dụng giao diện ISynchronizeInvoke?
- 7. Cách sử dụng giao diện trong Go
- 8. Sử dụng giao diện trong PHP
- 9. C# Cách sử dụng giao diện
- 10. Giao diện gọn gàng với giao diện MATLAB với mlabwrap
- 11. Sử dụng Singleton trong giao diện Builder?
- 12. Sử dụng lớp tĩnh theo giao diện?
- 13. Dependency Injection & sử dụng giao diện?
- 14. Cách sử dụng giao diện Comparator
- 15. Sử dụng Java Generics trong giao diện
- 16. Tại sao nên sử dụng Giao diện, Đa thừa kế và Giao diện, Lợi ích của Giao diện?
- 17. giao diện giống như giao diện điều khiển trên trang web bằng cách sử dụng javascript
- 18. Thực hiện các phương thức chung từ giao diện sử dụng giao diện khác
- 19. nếu sử dụng giao diện nên một lớp luôn thực hiện đúng giao diện
- 20. Tính đa hình giao diện kỳ lạ bằng cách sử dụng thành phần giao diện
- 21. OCR với giao diện Tesseract
- 22. Sử dụng nhiều giao diện mạng trong một ứng dụng
- 23. Việc sử dụng cách tạo lớp trong giao diện và giao diện bên trong lớp
- 24. C# - Cấu trúc cây xâm nhập, sử dụng CRTP
- 25. Loại "Được kế thừa" sử dụng CRTP và typedef
- 26. C# generics với giao diện
- 27. Giao diện MDI với FireMonkey
- 28. Mocking COM Giao diện bằng cách sử dụng Rhino Mocks
- 29. C# Sử dụng generics và thực hiện giao diện
- 30. Sử dụng giao diện điều khiển Putty trong Notepad ++
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 ... –
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