如何在xsdgen工具中支持层级继承?Go结构体生成问询
关于xsdgen生成适配派生类的Go结构体问题
xsdgen对层级继承的支持
xsdgen是支持XSD层级继承的,它会把XSD里的继承关系(比如<extension base="GenericObject">这类定义)转换成Go的结构体嵌入实现。生成的ABC、FOO结构体里会直接嵌入GenericObject,相当于间接实现了“继承”效果,基类的字段和方法都能被派生类直接使用。
让CreateObjectRequest适配派生类的实现方法
因为Go本身没有原生类继承,而是靠结构体嵌入和接口实现多态,你可以通过以下几种方式处理:
直接利用结构体嵌入的赋值特性
生成的ABC、FOO都嵌入了GenericObject,所以你可以直接把ABC/FOO的实例赋值给CreateObjectRequest的CreateObject字段:abcObj := &ABC{ GenericObject: GenericObject{ID: "123"}, ABCSpecificField: "abc-value", } req := CreateObjectRequest{CreateObject: abcObj}如果需要操作派生类的专属字段,只需要用类型断言转换:
if abc, ok := req.CreateObject.(*ABC); ok { fmt.Println(abc.ABCSpecificField) }自定义xsdgen生成模板(如果支持)
如果你使用的xsdgen版本支持自定义模板,可以修改模板,把CreateObject字段的类型改成一个自定义接口(比如GenericObjectInterface),这个接口包含GenericObject的所有方法。生成的ABC、FOO会自动实现这个接口,这样CreateObjectRequest就能直接接受任何派生类实例,不用每次都做类型断言。手动修改生成后的代码
如果模板自定义不可行,生成代码后可以手动调整:- 定义一个接口:
type GenericObjectInterface interface { // 这里列出GenericObject的所有方法,或者至少一个用于标识的方法 IsGenericObject() bool } - 给GenericObject、ABC、FOO都添加这个方法:
func (g *GenericObject) IsGenericObject() bool { return true } func (a *ABC) IsGenericObject() bool { return true } func (f *FOO) IsGenericObject() bool { return true } - 把CreateObjectRequest里的CreateObject字段类型改成
GenericObjectInterface,这样就能直接赋值ABC/FOO实例,同时保留类型安全。
- 定义一个接口:
内容的提问来源于stack exchange,提问作者Memo Karpa
相关产品推荐
相关产品推荐

