d重写弃用基类的弃用项可工作

原文
我好像发现了比较的场景,基类有旧和新方法,我想让用户迁移到新方法:

class Base {
    deprecated("改用新方法") abstract string oldWay();
    abstract string newWay();
}

class Child : Base {
    /+
    // 如果保留兼容,会得到:
    depre.d(14): 过期: `depre.Child.oldWay`在覆盖过期的`depre.Base.oldWay`
    //很好,我想让继承类知道他们应该迁移
    +/
    // override string oldWay() { return newWay(); }

    /+
    // ...如果只实现新方法,我就卡住了
    depre.d(11): 错误: 创建`Child`抽象类
    depre.d(11): 未实现`string oldWay()`
    +/
    override string newWay() { return "yay"; }

    /+
//所以不得不实现它.但是我想说,这样做只是为了`迁移`,想转发弃用的,但现在我得到两个警告!
    depre.d(27):弃用:`depre.Child.oldWay`在覆盖过期的`depre.Base.oldWay`方法
    depre.d(27):弃用:因为它正在覆盖基类中的函数,不能标记`depre.Child.oldWay`为`过期`
    +/
    override deprecated string oldWay() { return newWay(); }
}

void main() {
    auto child = new Child();
}

要弃用它,会给用户代码带来问题,也不能在不破坏用户体验就删除它(希望编译器告诉用户,使用时的变化!)

我可删除'抽象'来修改基类,使它工作,但如果既可在基类指示它,又能在子类上按已处理指示它,就更好了;"覆盖过期"应该抑制警告,并把它传递给下个用户.
如果正确理解,你需要这段代码:

class Base
  {
      deprecated("改用新方法") abstract string oldWay();
      abstract string newWay();
  }

  class Child : Base
  {
      override string newWay() { return "yay"; }
      override deprecated string oldWay() { return newWay(); }
  }

  void main()
  {
      auto child = new Child();
  }

优雅编译?是的话,那么已在最新的主分支中了.

已修复了!

posted @   zjh6  阅读(15)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示