72 lines
2.7 KiB
Go
72 lines
2.7 KiB
Go
package example
|
|
|
|
// FooBarGo is a superset of FooBarAbstract and hence FooBarGo can be used as a
|
|
// drop in replacement for FooBarAbstract but the reverse causes a compile time
|
|
// error.
|
|
type FooBarGo interface {
|
|
FooBarAbstract
|
|
deleteFooBarAbstract()
|
|
IsFooBarGo()
|
|
}
|
|
|
|
// Via embedding fooBarGo "inherits" all methods of FooBarAbstract.
|
|
type fooBarGo struct {
|
|
FooBarAbstract
|
|
}
|
|
|
|
func (fbgs *fooBarGo) deleteFooBarAbstract() {
|
|
DeleteDirectorFooBarAbstract(fbgs.FooBarAbstract)
|
|
}
|
|
|
|
// The IsFooBarGo method ensures that FooBarGo is a superset of FooBarAbstract.
|
|
// This is also how the class hierarchy gets represented by the SWIG generated
|
|
// wrapper code. For an instance FooBarCpp has the IsFooBarAbstract and
|
|
// IsFooBarCpp methods.
|
|
func (fbgs *fooBarGo) IsFooBarGo() {}
|
|
|
|
// Go type that defines the DirectorInterface. It contains the Foo and Bar
|
|
// methods that overwrite the respective virtual C++ methods on FooBarAbstract.
|
|
type overwrittenMethodsOnFooBarAbstract struct {
|
|
// Backlink to FooBarAbstract so that the rest of the class can be used by
|
|
// the overridden methods.
|
|
fb FooBarAbstract
|
|
|
|
// If additional constructor arguments have been given they are typically
|
|
// stored here so that the overridden methods can use them.
|
|
}
|
|
|
|
func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
|
|
// DirectorFooBarAbstractFoo calls the base method FooBarAbstract::Foo.
|
|
return "Go " + DirectorFooBarAbstractFoo(om.fb)
|
|
}
|
|
|
|
func (om *overwrittenMethodsOnFooBarAbstract) Bar() string {
|
|
return "Go Bar"
|
|
}
|
|
|
|
func NewFooBarGo() FooBarGo {
|
|
// Instantiate FooBarAbstract with selected methods overridden. The methods
|
|
// that will be overwritten are defined on
|
|
// overwrittenMethodsOnFooBarAbstract and have a compatible signature to the
|
|
// respective virtual C++ methods. Furthermore additional constructor
|
|
// arguments will be typically stored in the
|
|
// overwrittenMethodsOnFooBarAbstract struct.
|
|
om := &overwrittenMethodsOnFooBarAbstract{}
|
|
fb := NewDirectorFooBarAbstract(om)
|
|
om.fb = fb // Backlink causes cycle as fb.v = om!
|
|
|
|
fbgs := &fooBarGo{FooBarAbstract: fb}
|
|
// The memory of the FooBarAbstract director object instance can be
|
|
// automatically freed once the FooBarGo instance is garbage collected by
|
|
// uncommenting the following line. Please make sure to understand the
|
|
// runtime.SetFinalizer specific gotchas before doing this. Furthermore
|
|
// DeleteFooBarGo should be deleted if a finalizer is in use or the fooBarGo
|
|
// struct needs additional data to prevent double deletion.
|
|
// runtime.SetFinalizer(fbgs, FooBarGo.deleteFooBarAbstract)
|
|
return fbgs
|
|
}
|
|
|
|
// Recommended to be removed if runtime.SetFinalizer is in use.
|
|
func DeleteFooBarGo(fbg FooBarGo) {
|
|
fbg.deleteFooBarAbstract()
|
|
}
|