枚举作为 Scala 中建模类型的成员值或特征?

Enumeration as member value or trait for modelling type in Scala?

假设我拦截了网络流量并测量了每个数据包的时间、大小和类型(TCP、UDP、AppleTalk)。 IP 地址或数据之类的其他任何东西都不会被测量并且应该被建模。过滤和计算统计数据是我的想法。我无意扩展 specialize 类 for TCP, UDP, ... 额外的信息或功能。我是 Scale 的新手,想知道正确的方法是什么。

使用像 C/C++ 中的枚举:

object TransportType extends Enumeration {
     type TransportType = Value
     val TCP = Value("TCP")
     val UDP = Value("UDP") 
     val AppleTalk = Value("AppleTalk")

 }

 class Packet(val time:int , val size:Int, val type:TransportType)

 val p1 = new Packet(0, 200, TransportType.UDP)
 val p2 = new Packet(1, 1000, TransportType.TCP)

或具有特征:

object TransportType {
     trait TCP
     trait UDP
     trait AppleTalk
 }

 class Packet(val time:int , val size:Int)

 val p1 = new Packet(0, 200) with TransportType.UDP
 val p2 = new Packet(1, 1000) with TransportType.TCP

在后一种情况下,可能存在没有特殊类型的数据包。这在第一种情况下是不可能的。我对这些建模差异不感兴趣。我想知道是否建议像第二个解决方案中那样创建许多 traits/classes 并使用类型系统对属性进行编码。如果第二个解决方案是正确的,则假设数据包具有另一个属性 Origin。这样建模可以吗:

object Origin {
     trait NA
     trait SA
     trait EU
     trait Asia
     trait Africa
     trait Australia
 }

 val p1 = new Packet(0, 200) with TransportType.UDP with Origin.Asia

第二个解决方案是否正确 - Scala-tic - 解决方案?

一个很好的通用方法(有很多例外、保留和特殊情况,就像所有通用方法一样),我建议这样看:成员是属性,而特征是行为。

如果模型中的 tcp 数据包行为与 udp 不同(例如,一个有另一个没有的方法,或者如果有函数接受一个作为参数,但不是另一个等),它应该是一个特征,否则,一个 属性 应该做(如果有需要,你仍然可以有没有 "special type" 的数据包 - 只需制作 属性可选的,所以,这并不重要)。