考虑一下问题:
我们有一个带有抽象方法的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<String>)
{
val d = Derived1()
println(d.computeSomething(23))
}
我想让Base::execute
私有,这样Base
的任何子类都不能在不检查其参数的情况下偶然调用它。不幸的是,这是不可能的:
错误:(9,5)Kotlin:修饰符“private”与“abstract”不兼容
Kotlin的protected
优于Java的protected
,因为它使函数仅可供子类访问,但理想的情况是private
。
那么,有什么正确的方法来实现这种模式吗?另外,出于好奇,private
和abstract
的不兼容是故意选择的语言设计吗?
你可以让他们传递一个对象,如果他们想调用这个方法,这个对象将检查这个值。实例
abstract class Base
{
fun computeSomething(argument: Int): Int
{
return execute(ValueCheck(argument))
}
protected abstract fun execute(validArgument: ValueCheck)
protected class ValueCheck(a: Int)
{
private val value = checkValue(a)
private fun checkValue(argument: Int): Int
{
require(argument > 0)
return argument
}
fun get() = value
}
}
当派生类想要调用execute时,它必须传递在创建实例时检查值的对象
重写一个函数是没有意义的,但不能从该类调用。通过重写该函数,您拥有它的实现,因此可以调用它。
您可以通过将执行逻辑与派生类分离来实现所需的功能,这可以通过以下几种方式实现:
基的构造函数
通过将这些传递给其构造函数中的Base
类,您将它们的所有权转移到该类。
模板方法(Template Method) Intent 定义算法框架,并将一些步骤的实现延迟到子类。 通过模板方法,子类可以重新定义算法的某些步骤,而不用改变算法的结构。 Class Diagram Implementation 冲咖啡和冲茶都有类似的流程,但是某些步骤会有点不一样,要求复用那些相同步骤的代码。 // java public abstract class CaffeineBeve
我想创建两个带有模板方法(GOF)变体的HttpServlet。所以我创建了从HttpServlet扩展的抽象类: 两种混凝土等级: 在调用(成功)其中一个服务后,我无法得到任何响应。经过一些调试,Tomcat似乎在NIO通道和锁存器方面有一些问题: 2016-01-31 19:13:52 Http11NioProtocol[DEBUG]套接字:[org.apache.tomcat.util.ne
介绍 模板方法(TemplateMethod)定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模板方法是一种代码复用的基本技术,在类库中尤为重要,因为他们提取了类库中的公共行为。模板方法导致一种反向的控制结构,这种结构就是传说中的“好莱坞法则”,即“别找找我们,我们找你”,这指的是父类调用一个类的操作,而不是相反。具
模板方法模式提供了抽象基类具有不可重写的方法:该方法实现了通用算法,不应在子类中重写。在Java中,模板方法在抽象基类中声明为final,在C中,sealed关键字具有类似的含义,但不能声明未重写的方法。 我如何解决这个问题?为什么不能阻止一个方法可以被子类重写(在C中)?
嗨,我是Kotlin世界的新手。我喜欢到目前为止所看到的,并开始考虑将我们在应用程序中使用的一些库从Java转换为Kotlin。 第二次更新:问题是如何用Kotlin中的一些参数为一个简单的pojo编写一个构建器设计模式?下面的代码是我的尝试,方法是编写java代码,然后使用eclipse-kotlin-plugin转换为Kotlin。
本文向大家介绍设计模式中的模板方法模式在Ruby中的应用实例两则,包括了设计模式中的模板方法模式在Ruby中的应用实例两则的使用技巧和注意事项,需要的朋友参考一下 实例一 今天你还是像往常一样来上班,一如既往地开始了你的编程工作。 项目经理告诉你,今天想在服务器端增加一个新功能,希望写一个方法,能对Book对象进行处理,将Book对象的所有字段以XML格式进行包装,这样以后可以方便与客户端进行交互