Реализация наследования в привязках node.js

Я пишу привязки Node.js вокруг библиотеки C ++. Я могу идентифицировать ключевые объекты в библиотеке C ++, которые я могу представить как классы для Node.js (то есть производные от ObjectWrap). Я также вижу отношения наследования между этими объектами.

Как я могу разоблачить ClassA,ClassB,ClassC как классы node.js (производные от ObjectWrap) и манипулировать их прототипами (в коде C ++ v8), чтобы ClassB а также ClassC являются производными от ClassA?

4

Решение

Это можно сделать с помощью v8::FunctionTemplate«s Inherit метод. Это объяснили Вот. Вот рабочий пример.

Код C ++:

#include <v8.h>
#include <node.h>

using namespace node;
using namespace v8;

class BaseClass : ObjectWrap
{
public:
static Persistent<FunctionTemplate> s_ct;
static void Init(v8::Handle<Object> target)
{
Local<FunctionTemplate> t = FunctionTemplate::New(New);

s_ct = Persistent<FunctionTemplate>::New(t);
s_ct->InstanceTemplate()->SetInternalFieldCount(1);
s_ct->SetClassName(String::NewSymbol("BaseClass"));

NODE_SET_PROTOTYPE_METHOD(s_ct, "getName", getName);

target->Set(String::NewSymbol("BaseClass"), s_ct->GetFunction());
}

BaseClass(){}
~BaseClass(){}

static v8::Handle<Value> New(const Arguments& args)
{
HandleScope scope;
return args.This();
}

static v8::Handle<Value> getName(const Arguments& args)
{
HandleScope scope;
return scope.Close(String::New("Base"));
}
};

Persistent<FunctionTemplate> BaseClass::s_ct;

class DerivedClass : ObjectWrap
{
public:
static Persistent<FunctionTemplate> s_ct;
static void Init(v8::Handle<Object> target)
{
Local<FunctionTemplate> t = FunctionTemplate::New(New);

s_ct = Persistent<FunctionTemplate>::New(t);

// XXX Inherit from BaseClass
s_ct->Inherit(BaseClass::s_ct);

s_ct->InstanceTemplate()->SetInternalFieldCount(1);
s_ct->SetClassName(String::NewSymbol("DerivedClass"));

NODE_SET_PROTOTYPE_METHOD(s_ct, "getAge", getAge);

target->Set(String::NewSymbol("DerivedClass"), s_ct->GetFunction());
}

DerivedClass() {}
~DerivedClass() {}

static v8::Handle<Value> New(const Arguments& args) {
HandleScope scope;
return args.This();
}

static v8::Handle<Value> getAge(const Arguments& args)
{
HandleScope scope;
return scope.Close(Number::New(42));
}
};

Persistent<FunctionTemplate> DerivedClass::s_ct;

extern "C" {
static void init (v8::Handle<Object> target)
{
BaseClass::Init(target);
DerivedClass::Init(target);
}

NODE_MODULE(mymodule, init);
}

Положить в стандарт node-gyp конфигурации, и вы можете проверить его с помощью следующего JavaScript

var mymodule = require('./build/Release/mymodule');
var baseObject = new mymodule.BaseClass();
var dervObject = new mymodule.DerivedClass();

console.log(baseObject.getName());
console.log(dervObject.getName(), dervObject.getAge());
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]