You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 17:06:09