Tag: OOP与

Kotlin覆盖Java setter

我用这个方法实现一个java接口(Command): void setInputStream(InputStream in); 我想用Kotlin制定者来覆盖这个: class ProxyCommand : Command { lateinit var _inputStream: ChannelPipedInputStream var inputStream: InputStream get() = this._inputStream set(value) { // This should override it. this._inputStream = (value as ChannelPipedInputStream) } } 但是我得到这个错误在set(value) : Accidental override: The following declarations have the same JVM signature (setInputStream(Ljava/io/InputStream;)V): public final fun (value: InputStream): Unit defined in […]

面向对象的小型到中型SQL数据库设计

作为一个个人项目,我想在Kotlin做一个“预算管理”应用程序,用户可以在其中输入价格和数量等各种项目和描述符。 我想将数据存储在H2数据库中,然后使用预定义的函数进行过滤和查看数据。 例如,如果用户想要知道他们在两个日期之间花了多少钱,或者他们的总支出在两个日期之间增加或减少了多少百分比,或者他们在用户定义的目标(例如储蓄账户)上的进展如何。 这是我的Github项目。 我正在使用SQL“Kotlin Exposed”API。 例如,这是我的“基本”表: package tables import org.jetbrains.exposed.sql.Column import org.jetbrains.exposed.sql.Table object Essential : Table() { val id: Column = Essential.integer(“id”).autoIncrement().primaryKey() val name: Column = Essential.varchar(“name”, length = 25) val desc: Column = Essential.varchar(“description”, length = 50) val price: Column = Essential.varchar(“price”, length = 9) val quant: Column = Essential.varchar(“quantity”, length = 25) […]

联盟类型/扩展接口

我有几个data class与字段,这是在形式中使用,并需要他们有一个方法返回true如果任何字段已被填写。 我不想为所有的课程重写这个,所以我现在这样做: data class Order(var consumer: String, var pdfs: List<URI>): Form { override val isEmpty(): Boolean get() = checkEmpty(consumer, pdfs) } data class SomethingElse(var str: String, var set: Set<String>): Form { override val isEmpty(): Boolean get() = checkEmpty(str, set) } interface Form { val isEmpty: Boolean fun <T> checkEmpty(vararg fields: T): Boolean { for […]

强大的静态面向对象Scala的多样化替代方案

我想知道是否有任何替代Scala的尝试提供更强大的类型系统和语法。 我知道像Haskell这样的功能性选择,但是有没有真正推动事物的静态OO方面,例如在Scala缺乏的地方,如虚拟类,完全多重继承和更灵活的构造函数语法,static合同检查,更强大的路径依赖,MyTypes,朋友修改,一流的进口,或者一些深奥的打字工具,我甚至没有想到/听说过。 面向对象,在一定程度上静态这些天似乎并不流行。 然而,现代计算机的力量使得编译器的创建超出了过去几十年编译器作者的梦想。 我认为,因为我没有遇到任何事情,没有别的选择,我很可能很快就要淘汰生产代码。 但是,即使他们仍然是学术语言,我还是要留意他们,也许还会玩弄他们。 我正在寻找什么可能被称为左侧领域替代斯卡拉。 所以不是锡兰或者科特林,他们试图把简单性放在优先权上。 埃菲尔这几天似乎没有去。 我遇到过gBeta和Ceasar,但是如果有什么地方输给Scala的话,一直没法解决。 还有其他的可能吗?

完全符合功能范式的准则/实践/规则的详尽列表是什么?

我已经开始和Kotlin一起玩,但是我感觉到我自己的限制。 我的问题是,我仍然认为Java因此风格仍然是必要的,我的问题是所有功能编程狂热者,我认为这将是所有人在开始阶段非常有用,也需要“制动”他们的大脑重新开始建设; 离开舒适区,开始思考伪,而不是“你的第一语言是什么”。 我相信,有经验的多语言开发人员可能会将这些概念咀嚼成简单的建议,使您的程序以完全有效的方式编写,甚至违反了范例 。 我不知道所有的怪癖,但请不要犹豫,包括我可能不知道的普遍接受的条件(我可以随时查找)。 在这一点上,我需要这套规则来让自己受到伤害,而不是打破他们,但是我知道我会感觉到,分析指导原则,了解他们如何变得更坏/更好,这当然是我自己的功课。 所以这些指南的例子就是这样的: 永远不要改变状态,这可以通过使用x,y,z来避免 只使用高阶函数(我可能是错的,只是例子) 我希望这个答案能给我长期的参考,让自己处于极端的条件下,当我感到不舒服的时候,我会停止逃避OOP。 而现在,当我看着Kotlin时,我明白我应该怎样思考问题,而不是用一种语言或另一种语言强加的结构。 意图总是可以转换为您选择的语言,并以适用于该语言的设计模式作为后盾,但是要找到中间地带,我需要首先从舒适区域监禁自己。

在基于GUI的应用程序中处理不变性

我有一个基于GUI的应用程序(Kotlin),它由左边的Note列表(显示注释的标题)和右边选定的Note版本屏幕组成。 当用户在编辑屏幕上修改标题时,列表项必须显示新的标题。 在一个可变的世界里,我会做这样的事情: interface Note { fun title(): String fun content(): String fun setTitle(newTitle: String) fun setContent(newTitle: String) fun addListener(l: Listener) } class NoteListItem(n: Note) : Listener { init { n.addListener(this) } override fun onChange() { //from Listener repaint(); } fun repaint() { //code } } class NoteEditionScreen(n: Note) { fun onTitleTextChanged(newTitle: String) { n.setTitle(newTitle) […]

从不同的界面覆盖相同的签名

如果我们有两个接口,使用相同的签名方法,我们可以在一个类中实现它们,方法如下: interface A { void doStuff(); } interface B { void doStuff(); } class Test : A, B { void A.doStuff() { Console.WriteLine("A"); } void B.doStuff() { Console.WriteLine("A"); } } 如果我们把它转换成Kotlin我们有 interface A { fun doStuff() } interface B { fun doStuff() } class Test : A, B { override fun doStuff() { println("Same for […]

生成toString方法来包含基类的成员?

我正在尝试在Kotlin中构建一个DTO(数据传输对象)类,以便从Java应用程序调用。 鉴于以下代码: BaseDto.kt package sandbox.KotlinDataObjects import org.apache.commons.lang3.builder.ToStringBuilder import java.sql.ResultSet import java.sql.SQLException /** * Base DTO * (JSON/XML serialization code removed for clarity) */ abstract class BaseDto( var id: Long = 0 ) { @Throws(SQLException::class) open protected fun fromResultSet(rs: ResultSet) { this.id = rs.getLong("id") } /** * Override toString and use StringBuilder * Since DataObject may […]

抽象类与Lambda参数

由于kotlin对lambdas有很好的支持,我开始使用lambdas作为abstract类的构造函数参数,而不是声明abstract val/fun 。 我认为这更简洁,特别是因为val type get的推断。 这有什么缺点? abstract class AbstractListScreen<T> ( val data: Set<T>, val filterators: (T) -> Set<String> ) { fun open() { /* … */ } } class OrderListScreen : AbstractListScreen<Data>(data = setOf(), filterators = { setOf(it.toString()) } ) { fun someEvent() { /* …*/ } }

传入参数时Kotlin类型不匹配

我重写了一个父类中的函数,它需要一个Any类型的参数。 我想要吗? 成为Venue类型的一个实例,这样我就可以把它的id,但是,我不能使用getModelId(model: Venue?)来覆盖函数,因为这不是超类中定义的方式。 什么是最好的方式来确保这个用例模型的类实例是Venue? 我可以把它里面的数据抽出来,我想要吗? open class VenueAdapter: ParentClass() { override fun getModelId(model: Any?): Any? { //here I want to be able to pull the id out of the Venue class instance return model.id } 抽象类ParentClass {//我也试着用类型参数fun getModelId(model:M)来定义它,但是没有成功。 抽象的乐趣getModelId(模型:任何?):任何? } data class Venue (id: String) 我也考虑过了 override fun getModelId(model: Any?): Any? { when (model) […]