Этот метод не является чем-то необычным для библиотек: v8::internal::Isolate
- это реализация, но ее детали полностью инкапсулированы в библиотеке и скрыты от общедоступного API. v8::Isolate
это просто непрозрачная ссылка. Наблюдайте, как у него нет полей; Embedders ничего не знает о том, как он выглядит в памяти (или вообще имеет ли он представление в памяти - насколько они могут быть связаны с файловым дескриптором ядра). Причина такой инкапсуляции, конечно же, заключается в том, чтобы разделить задачи и сделать компоненты независимыми друг от друга: библиотека может изменить внутреннее определение класса без необходимости в средствах вставки (то есть они не могут зависеть от внутреннего состояния). так что гарантируется, что они не будут нарушены изменениями, их даже не нужно перекомпилировать, потому что публичный API [и ABI] не меняется при изменении макета внутреннего класса).
Рассмотрим уменьшенный пример, демонстрирующий принцип:
/* public API */
class BlackBox {
public:
static BlackBox* Create();
void DoSomething();
}
void StandaloneFunction(BlackBox* box);
/* internal implementation */
class TheRealThing {
public:
TheRealThing(int value) : value_(value) {}
private:
int value_;
}
BlackBox* BlackBox::Create() {
TheRealThing* real = new TheRealThing(42);
return reinterpret_cast<BlackBox*>(real);
}
void BlackBox::DoSomething() {
TheRealThing* real = reinterpret_cast<TheRealThing*>(this);
printf("Hello %d\n", real->value_);
}
void StandaloneFunction(BlackBox* box) {
TheRealThing* real = reinterpret_cast<TheRealThing*>(box);
printf("Good bye %d\n", real->value_);
}