如何限制Scala对象中所有方法的类型?
How to restrict the types of all methods in a Scala object?
我正在尝试做一些我不完全确定是否可行或有意义的事情。
我有一个抽象,换句话说,它在很大程度上依赖于一个对象来告诉要使用给定组件的哪个版本。它是这样的:
object ComponentManager {
def component1Version: ComponentVersion = Component1Version1()
def component2Version: ComponentVersion = Component2Version3()
}
这里我想实现的是限制ComponentManager
对象中的所有方法都符合ComponentVersion
类型。我可以定义一个特征来强制类型,但我事先不知道我将拥有多少组件。因此,我最终可能会看到人们向管理器对象添加一些内容,例如:
object ComponentManager {
def component1Version: ComponentVersion = Component1Version1()
def component2Version: ComponentVersion = Component2Version3()
def component3Version = objectWithWrongType() // this is the problematic line
}
对于 component3Version
,我们有违规对象。它会编译,但我宁愿在发生这种情况时出现编译错误,因为我有一些检查 "freely" 正确输入。
同样,我不知道管理器会有多少组件,所以我不能真正依赖于指定每个方法类型的特征。
我已经阅读了有关 F-bound 类型/函数/什么不是的内容,但仍然无法弄清楚它们是否/如何使它们适用于我的问题。
有什么想法吗? "Your restraing doesn't make sense" 也是一个可能的答案,我想,但无论如何我想就此获得一些想法。
我做出以下假设:
- 当有人创建管理器时,他们知道他们需要多少组件。
- 必须声明所有组件的版本。
Traits 必须显式声明所有方法名称,因此我们不能为我们不知道的组件声明方法。相反,让我们将组件建模为一种类型:
trait ComponentManager {
type Component
def version(component: Component): Version
}
当有人知道他们需要什么组件时,他们可以实施管理器:
sealed trait MyComponent
case object Component1 extends MyComponent
case object Component2 extends MyComponent
case object Component3 extends MyComponent
object MyComponentManager extends ComponentManager {
type Component = MyComponent
def version(component: MyComponent): Version = component match {
case Component1 => Component1Version1()
case Component2 => Component2Version3()
case Component3 => Component3Version5()
}
}
现在:
- 为任何组件返回
Version
以外的任何内容都是类型错误。
- 忘记匹配组件是非详尽匹配警告。
我正在尝试做一些我不完全确定是否可行或有意义的事情。
我有一个抽象,换句话说,它在很大程度上依赖于一个对象来告诉要使用给定组件的哪个版本。它是这样的:
object ComponentManager {
def component1Version: ComponentVersion = Component1Version1()
def component2Version: ComponentVersion = Component2Version3()
}
这里我想实现的是限制ComponentManager
对象中的所有方法都符合ComponentVersion
类型。我可以定义一个特征来强制类型,但我事先不知道我将拥有多少组件。因此,我最终可能会看到人们向管理器对象添加一些内容,例如:
object ComponentManager {
def component1Version: ComponentVersion = Component1Version1()
def component2Version: ComponentVersion = Component2Version3()
def component3Version = objectWithWrongType() // this is the problematic line
}
对于 component3Version
,我们有违规对象。它会编译,但我宁愿在发生这种情况时出现编译错误,因为我有一些检查 "freely" 正确输入。
同样,我不知道管理器会有多少组件,所以我不能真正依赖于指定每个方法类型的特征。
我已经阅读了有关 F-bound 类型/函数/什么不是的内容,但仍然无法弄清楚它们是否/如何使它们适用于我的问题。
有什么想法吗? "Your restraing doesn't make sense" 也是一个可能的答案,我想,但无论如何我想就此获得一些想法。
我做出以下假设:
- 当有人创建管理器时,他们知道他们需要多少组件。
- 必须声明所有组件的版本。
Traits 必须显式声明所有方法名称,因此我们不能为我们不知道的组件声明方法。相反,让我们将组件建模为一种类型:
trait ComponentManager {
type Component
def version(component: Component): Version
}
当有人知道他们需要什么组件时,他们可以实施管理器:
sealed trait MyComponent
case object Component1 extends MyComponent
case object Component2 extends MyComponent
case object Component3 extends MyComponent
object MyComponentManager extends ComponentManager {
type Component = MyComponent
def version(component: MyComponent): Version = component match {
case Component1 => Component1Version1()
case Component2 => Component2Version3()
case Component3 => Component3Version5()
}
}
现在:
- 为任何组件返回
Version
以外的任何内容都是类型错误。 - 忘记匹配组件是非详尽匹配警告。