代码之家  ›  专栏  ›  技术社区  ›  Damn Vegetables

重写时如何标记不调用超类的实现?

  •  0
  • Damn Vegetables  · 技术社区  · 6 年前

    假设库的方法采用回调处理程序 Handler ,但为了处理结果,重复使用相同的逻辑。所以,我创建了一个类 SimpleHandler 这是有道理的。假设使用该类的用户重写其方法 onSuccess onFail ,如有必要。但如果特定情况下不需要处理,则用户可能不会覆盖它们,并且 SimpleHandler 将使用的默认处理程序。

    问题是,当我自动完成这些方法时,IDE会自动插入超级调用,比如 super.onFail() 。对于此代码,如下面所示,如果它被重写,则不应调用super方法。有没有办法标记在重写时不应调用super方法,以便IDE停止插入它?

    interface Handler
    {
        fun onFinished(result:Int);
    }
    
    abstract class SimpleHandler:Handler
    {
        override fun onFinished(result: Int)
        {
            if(result==0)
            {
                onSuccess();
            }
            else
            {
                onFail();
            }
        }
    
        open fun onSuccess()
        {
            println("The developer is so lazy that he did not do anything.");
        }
        open fun onFail()
        {
            println("The developer is so lazy that he did not do anything.");
        }
    }
    
    fun doSomething(handler:Handler)
    {
        handler.onFinished(10);
    }
    
    fun main(args: Array<String>)
    {
    
        doSomething(object: SimpleHandler(){
            override fun onSuccess() {
                println("I won! I won!");
            }
    
            override fun onFail() {
                //super.onFail();
                println("Me fail English?");
            }
        })
    }
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   Alexey Romanov    6 年前

    在IDEA/Android Studio中,这由 Editor > File and Code Templates 在下面 Settings

    在我的安装中,我看到 Overridden Method Body Overridden Scala Method Body 但Kotlin没有特殊的模板。所以我希望Kotlin使用Java模板。

    您可以将此模板更改为不调用 super 对于给定的方法名称,但您似乎无权访问超类型的名称。有关如何共享模板的信息,请参阅链接文档。

        2
  •  0
  •   NSimon    6 年前

    哎呀,写这样的东西没问题:

    fun doSomething(handler:Handler, result: Int) {
        handler.onFinished(result)
    }
        fun main() {
            doSomething(object: SimpleHandler() {
                override fun onFail() {
                    println("My custom message")
                }
            }, 10)
        }
    
        fun main2() {
            doSomething(object : SimpleHandler() {
                override fun onSuccess() {
                    println("My other custom message")
                }
            }, 0)
        }
    

    如果需要,开发人员只需覆盖他感兴趣的回调。 在这种情况下,In main()失败,它将打印“我的自定义消息”。如果成功,将调用默认的onSuccess()。 main2()的情况也是相反的:如果成功,它将打印“我的其他自定义消息”,但如果失败,它只会调用默认的onSuccess。

    在AS 3.1.1中使用组织进行测试。喷气式飞机。kotlin:kotlin-stdlib-jre7:1.2.31

        3
  •  0
  •   Vlad    3 年前

    您需要为此定义一个单独的皮棉检测器。 Lint突出显示应调用super但不调用super的重写,方法是使用 @CallSuper 注释,这是此Lint检测器所能实现的: https://cs.android.com/android/platform/superproject/+/master:tools/base/lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks/CallSuperDetector.java

    当然,这可能是需要首先学习的新知识,但编写自定义Lint规则并不难。以下是一些很好的起点:

    Android Lint工具指南 https://developer.android.com/studio/write/lint.html

    2017年Kotlin会议Lint Talk https://www.youtube.com/watch?v=p8yX5-lPS6o