如何标记不打电话给超级班级'重写时的实现?

时间:2018-04-16 08:16:50

标签: kotlin

假设Library的方法采用回调处理程序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?");
        }
    })
}

2 个答案:

答案 0 :(得分:0)

AFAIK,写这样的东西没有问题:

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)
    }

如果需要,开发人员只需要覆盖他感兴趣的回调。 在这种情况下,在main()失败时,它会打印&#34;我的自定义消息&#34;。如果成功,将调用默认的onSuccess()。 反之亦然,对于main2():如果成功,它将打印&#34;我的其他自定义消息&#34;,但它失败,它只是调用默认的onSuccess。

使用org.jetbrains.kotlin在AS 3.1.1上测试:kotlin-stdlib-jre7:1.2.31

答案 1 :(得分:0)

在IDEA / Android Studio中,这由Settings下的Editor > File and Code Templates管理。

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

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