加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何在Kotlin中实现模板方法设计模式?

发布时间:2020-12-15 01:08:18 所属栏目:Java 来源:网络整理
导读:考虑一下问题: 我们有一个带抽象方法的Base类.现在,我们希望强制执行此方法的每个覆盖都将执行一些参数检查或其他一些苦差事.我们希望这个参数检查在所有覆盖中都是相同的.一种解决方案是将此行为包装在一个非抽象方法中,该方法调用一个抽象方法: abstract

考虑一下问题:

我们有一个带抽象方法的Base类.现在,我们希望强制执行此方法的每个覆盖都将执行一些参数检查或其他一些苦差事.我们希望这个参数检查在所有覆盖中都是相同的.一种解决方案是将此行为包装在一个非抽象方法中,该方法调用一个抽象方法:

abstract class Base
{
    fun computeSomething(argument: Int): Int
    {
        require(argument > 0) // Some intricate checking
        return execute(argument)
    }

    // Pure functionality,assuming correct arguments
    // Ideally,this would be private. 
    protected abstract fun execute(validArgument: Int): Int
}

class Derived1: Base()
{
    override fun execute(validArgument: Int): Int =
        validArgument * validArgument
}

class Derived2: Base()
{
    override fun execute(validArgument: Int): Int =
        validArgument * validArgument * validArgument
}


fun main(args: Array

我想让Base :: execute private,这样Base的子类就不会在不检查其参数的情况下偶然调用它.不幸的是,这是不可能的:

Error:(9,5) Kotlin: Modifier ‘private’ is incompatible with
‘abstract’

Kotlin的受保护比Java受保护更好,因为它使函数只能访问子类,但理想情况仍然是私有的.

那么有没有一种正确的方法来实现这种模式?另外,出于好奇,私人和抽象的不兼容是故意选择语言设计吗?

最佳答案
对函数进行重写没有意义,但是不能从该类调用.通过覆盖该函数,您可以拥有它的实现,因此可以调用它.

您可以通过从派生类中分离执行逻辑来完成您想要的任务,这可以通过以下几种方式完成:

>您可以使用lambda,并将其传递给Base的构造函数
>您可以创建一个处理执行逻辑的接口实现

通过将它们传递给构造函数中的Base类,您将其所有权转移到该类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读