Sorbet中如何从基类继承方法类型签名?
关于Sorbet子类方法签名继承的问题解答
核心结论
是的,你必须在每个重写基类方法的子类中显式声明方法签名(sig),并且需要配合override关键字来保证类型安全和继承特性。
关键原因说明
- Sorbet的类型系统依赖显式签名,不会自动将基类的方法签名继承到子类重写的方法中。即使基类方法标记了
overridable,也仅表示该方法允许被重写,并不会让子类自动复用其类型定义。如果子类方法没有显式sig,Sorbet会默认推断为T.untyped,也就是你遇到的情况。 - 使用
override关键字的作用:在子类sig中添加override后,Sorbet会自动验证子类的签名是否与基类的overridable签名兼容(比如参数类型是否符合逆变规则、返回值是否符合协变规则),避免你意外写出不符合基类契约的重写方法,同时完整保留类型继承的特性。
修正后的代码示例
class Base extend T::Sig sig do overridable.params( attr1: T::Hash[T.any(Symbol, String), T.anything], attr2: T::Hash[T.any(Symbol, String), T.anything] ).void end def method_to_use_or_override(attr1, attr2); end end class UseCase < Base extend T::Sig # 子类必须显式引入T::Sig sig do override.params( attr1: T::Hash[T.any(Symbol, String), T.anything], attr2: T::Hash[T.any(Symbol, String), T.anything] ).void end def method_to_use_or_override(attr1, attr2) attr1[:key] = attr2[:key] end end
额外说明
如果子类需要对方法签名进行合法的细化(比如参数类型更严格、返回值类型更具体,符合Sorbet的协变/逆变规则),也可以调整子类的sig,但必须通过override让Sorbet验证其与基类签名的兼容性。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

