gpt4 book ai didi

scala - 密封具有许多子类型的类

转载 作者:行者123 更新时间:2023-12-01 08:28:19 24 4
gpt4 key购买 nike

我正在将我的一个 C++ 程序移植到 Scala 中。在那个项目中,有数百个用户定义的类,它们按组织的层次结构排列。如果我密封了一个顶级抽象类,根据 Scala 规则,我必须将该类的所有子类型的定义放在与密封类/特征相同的文件中。对于我的一个类层次结构,这意味着在该文件中放置大约 30 个类的定义。

在我的 C++ 程序中,这 30 个类位于它们自己的头文件和实现文件中,使它们更易于维护和阅读。我担心如果我将这 30 个类/对象的定义放在我的 Scala 应用程序的一个文件中,将使它们难以维护和阅读。

密封该类的原因是我可以在对这些类型进行模式匹配时进行详尽的搜索。在组织 Scala 类层次结构方面为我指出正确方向的任何帮助将不胜感激。

最佳答案

在单独的类中执行此操作有点麻烦,但它可能比将所有内容都放在一个大文件中更轻松。首先,您需要确保将所有文件编译在一起。然后,在确保所有内容都已密封的文件中,执行以下操作:

trait GenericA { def foo: Int }
sealed trait A extends GenericA
case class B() extends A with ImplB {}
case class C() extends A with ImplC {}
...

诀窍是父类(super class)中的所有内容(如果您愿意,它可以是抽象类而不是特征)都进入 GenericA。但实际上您从未在代码中使用 GenericA,您只是使用A。现在,您可以为每个实现编写一堆单独的文件,定义如下:

// File #1
trait ImplB extends GenericA { def foo = 7 }

// File #2
trait ImplC extends GenericA { def foo = 4 }

...

现在您已经分离了您的实现(至少那些只能用 GenericA 表示的部分)。

如果您还需要案例类参数怎么办?没问题——只需将这些作为特征的一部分包括在内即可。

// Main file
case class D(i: Int) extends A with ImplD {}

// Separate file
trait ImplD {
def i: Int
def foo = i*3
}

这是一些额外的工作,因为您必须在两个位置重复案例类参数,但在您的情况下这可能是值得的。

关于scala - 密封具有许多子类型的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27881462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com