Base Eric Finn's answer, można po prostu zadeklarować klasę interface
do przechowywania wszystkich publicznych metod, które uważane są twoje API i ukryć wszystkie implementacje i prywatne członków/metod w klasie realizacji, która dziedziczy interface
klasę, oto przykład:
Twój plik nagłówka: my_api.h
// your API in header file
// my_api.h
class interface {
public:
static interface* CreateInstance();
virtual void draw() = 0;
virtual void set(int) = 0;
};
implementacja (wspólna biblioteka): my_api.cpp (użytkownicy nie będą widzieć tego, kiedy sprawiają, że wspólna biblioteka) Więc można ukryć wszystko implementacja i priva Te metody/członków tutaj
#include "my_api.h"
// implementation -> in .cc file
class implementation : public interface {
int private_int_;
void ReportValue_();
public:
implementation();
void draw();
void set(int new_int);
};
implementation::implementation() {
// your actual constructor goes here
}
void implementation::draw() {
cout << "Implementation class draws something" << endl;
ReportValue_();
}
void implementation::ReportValue_() {
cout << "Private value is: " << private_int_ << endl;
}
void implementation::set(int new_int) {
private_int_ = new_int;
}
interface* interface::CreateInstance() {
return new implementation;
}
jaki użytkownik korzysta z API:
#include <iostream>
#include "my_api.h"
int main(int argc, const char * argv[])
{
using namespace std;
interface* a; interface* b;
a = interface::CreateInstance();
a->set(1);
b = interface::CreateInstance();
b->set(2);
b->draw();
a->draw();
return 0;
}
wyjściowa:
Implementation class draws
Private int is: 2
Implementation class draws
Private int is: 1
W tym wzorze, Twój API jest po prostu klasą abstrakcyjną, która działa jak fabryka możesz również wdrożyć metodę wirtualną w różnych klasach i określić, z której instancji chcesz zadzwonić.
Wygląda na to, że można użyć idiomu Pimpl. Ale niezależnie od metody, której używasz na końcu, musisz mieć świadomość, że ukrywanie implementacji może mieć problemy z wydajnością (kompilator nie będzie w stanie wstawić wiele). – syam