Thanks for your reply. Indeed i'm using extend now.. it was one of my
possible design, and i was assessing all possible cases.
I have come to this design. And i have a question, what is
AddExtension for ?
#File AbstractClass
option optimize_for = SPEED;
message AbstractClass
{
optional int32 AbstractClassInformation = 1;
extensions 100 to 199;
}
#File ConcreteClass
import "AbstractClass.proto";
message ConcreteClass
{
required AbstractClass super = 1;
extend AbstractClass
{
optional ConcreteClass derived_ConcreteClass = 100;
}
}
And using carefully the Extension API, i.e. letting the nested object
or extend part creation to the Extension API, i think
i managed to obtain a double link between the abstract and concrete
objects.
//test to see field manipulation of Abstract Class from Derived Class
void Test_HD_LinkDerivedToAbstract()
{
ConcreteClass * cc = new ConcreteClass();
AbstractClass * ac = cc->mutable_super();
//42...
cc->mutable_super()->set_abstractclassinformation(42);
//yes it does not create another instance
AbstractClass * ac2 = cc->mutable_super();
std::cout << "test on link derived to abstract " << endl;
std::cout << "information from cc instance " << cc->super
().abstractclassinformation() << endl;
std::cout << "information from ac instance " << ac-
>abstractclassinformation() << endl;
std::cout << "information from ac2 instance " << ac2-
>abstractclassinformation() << endl;
}
//test to see field manipulation of Derived Class
void Test_HD_LinkAbstractToDerived()
{
AbstractClass * ac = new AbstractClass();
//Add extension doesn't seem to work and i dunno why?
//ac->AddExtension(ConcreteClass::derived_ConcreteClass);
ConcreteClass * cc = ac->MutableExtension
(ConcreteClass::derived_ConcreteClass);
cc->mutable_super()->set_abstractclassinformation(42);
ConcreteClass * cc2 = ac->MutableExtension
(ConcreteClass::derived_ConcreteClass);
cc2->mutable_super()->set_abstractclassinformation(422);
std::cout << "test on link abstract to derived" << endl;
std::cout << "information from ac instance " << ac-
>abstractclassinformation() << endl;
std::cout << "information from cc instance " << cc->super
().abstractclassinformation() << endl;
std::cout << "information from cc2 instance " << cc2->super
().abstractclassinformation() << endl;
//test ClearExtension OK
//ac->ClearExtension(ConcreteClass::derived_ConcreteClass);
//test HasExtension OK
bool hasExtension = ac->HasExtension
(ConcreteClass::derived_ConcreteClass);
(hasExtension) ? std::cout << "well done ;) \n" : std::cout << "T_T
have to change your design\n";
}
This current design kind of satisfying me, i will try to test it in
the Java generated Classes :) .
cheers,
Pascal Ly.
> > > Pascal Ly.- Hide quoted text -
>
> - Show quoted text -