【发布时间】:2016-10-12 11:03:42
【问题描述】:
我有几个类都扩展了相同的特征,并且都共享应该改变它们状态的相互功能。但是我想知道是否有更好的方法来实现相同的功能。
例如:
trait Breed
case object Pincher extends Breed
case object Haski extends Breed
trait Foox{
def age: Int
def addToAge(i: Int): Foox
}
case class Dog(breed: Breed, age: Int) extends Foox
case class Person(name: String, age: Int) extends Foox
我希望addToAge 将返回具有附加 int 的相同对象,
当然我可以为每个类实现相同的,这与 DRY 规则相矛盾:
case class Dog(breed: Breed, age: Int) extends Foox{
def addToAge(i: Int) = copy(age = age + i)
}
case class Person(name: String, age: Int) extends Foox{
def addToAge(i:Int) = copy(age = age + i)
}
有没有更好的方法来避免这种情况?
是否有一个选项可以避免在每个案例类中重新定义 age:Int 并保持其状态(年龄已在特征中定义)?
【问题讨论】:
-
如果你试图改变同一个对象的状态,你可能违反了不变性原则。因此
copy似乎是一种方法。状态应该由使用这些对象的代码维护,即更新自己的状态以使用addToAge返回的对象 -
我不认为这里有一个简单的答案。我想到的最接近的想法是使用某种形式的镜头或使用无形库。您必须放弃 OO 并使用更多功能的抽象。例如,如果您有一个
map(),它只是改变了年龄,而让其他一切保持原样,您将在这种情况下实现您所需要的。 -
您可以尝试
copy方法,就像在这个问题stackoverflow.com/questions/5341120/… 中一样,但这只会使您的案例类类型复杂化和限制。原因是copy只在case类本身中可用。 -
有趣的问题......似乎围绕“复制”方法的魔法打破了通常的解决方案(即结构类型和宏)。您也许可以使用大量反射代码来实现这一点,但这可能不是您想要的。
标签: scala functional-programming