【发布时间】:2016-01-24 20:07:03
【问题描述】:
我注意到 Scala 有案例类。这些似乎是用于模式匹配,但我喜欢我可以用它们做到这一点:
val bankAccount1 = new BankAccount("Daniel", 100)
val bankAccount2 = bankAccount1.copy(funds = 200)
现在“丹尼尔”有两个银行账户,一个是 100 美元,一个是 200 美元。但是当事情变得更复杂时,BankAccount 需要被子类化,这不起作用,因为案例类不能扩展其他案例类。
我想要不可变的类,而不是可以扩展到更多不可变的类。就像我希望能够扩展 BankAccount 以拥有不可变的子类 SavingsBankAccount 和 CheckingBankAccount。我不确定此时我是否需要扩展/实现Clonable 接口或定义自定义复制方法或类似的东西。我不想在课堂上放太多样板。
(如果可能),如何在 Scala 中创建可以复制和子类化且不会过于混乱或冗长的不可变类?
【问题讨论】:
-
从功能性、不可变类继承的问题在于,它们不再(保证是)功能性、不可变的,因为子类可能会覆盖其中一种方法以产生副作用。尝试通过静态类型检查来解决这个问题很棘手,基本上相当于解决了停机问题。
-
这就是我基本上解决这个问题的方法:youtube.com/edit?o=U&video_id=XeNptFcekSA。我做了一个隐式消息转发函数,并让子类有一个名为“parent”的参数转发给超类。超类本身只包含数据,然后我为功能添加了特征。这有多酷?