如何限制Scala对象中所有方法的类型?

如何限制Scala对象中所有方法的类型?,scala,types,traits,Scala,Types,Traits,我正在尝试做一些我不完全确定是否可能或有意义的事情 我有一个抽象,换句话说,它在很大程度上依赖于一个对象来判断要使用给定组件的哪个版本。事情是这样的: object ComponentManager { def component1Version: ComponentVersion = Component1Version1() def component2Version: ComponentVersion = Component2Version3() } 我想在这里实现的是将Compo

我正在尝试做一些我不完全确定是否可能或有意义的事情

我有一个抽象,换句话说,它在很大程度上依赖于一个对象来判断要使用给定组件的哪个版本。事情是这样的:

object ComponentManager {
  def component1Version: ComponentVersion = Component1Version1()
  def component2Version: ComponentVersion = Component2Version3()
}
我想在这里实现的是将
ComponentManager
对象中的所有方法限制为符合类型
ComponentVersion
。我可以定义一个trait来强制这些类型,但我不知道我将拥有多少组件。因此,我可能最终会让人们向manager对象添加一些内容,如:

object ComponentManager {
  def component1Version: ComponentVersion = Component1Version1()
  def component2Version: ComponentVersion = Component2Version3()
  def component3Version = objectWithWrongType()  // this is the problematic line
}
对于
组件3version
,我们有一个有问题的对象。它将被编译,但我宁愿在发生这种情况时出现编译错误,因为我有一些通过正确键入“自由”进行的检查

同样,我不知道管理器将有多少组件,因此我不能真正依赖于指定每个方法类型的特性

我已经读过关于F-bound类型/函数/什么没有的东西,但仍然不知道它们是否是/如何使它们适用于我的问题


有什么想法吗?“你的限制没有意义”也是一个可能的答案,我想,但无论如何,我想得到一些想法。

我做出以下假设:

  • 当有人创建管理器时,他们知道需要多少组件
  • 必须声明所有组件的版本
trait必须显式地声明所有方法名,所以我们不能为我们不知道的组件声明方法。相反,让我们将组件建模为一种类型:

trait组件管理器{
类型组件
def版本(组件:组件):版本
}
当有人知道他们需要什么组件时,他们可以实施管理器:

密封特性MyComponent
案例对象组件1扩展了MyComponent
案例对象组件2扩展了MyComponent
案例对象组件3扩展了MyComponent
对象MyComponentManager扩展ComponentManager{
类型组件=MyComponent
def版本(组件:MyComponent):版本=组件匹配{
case Component1=>Component1Version1()
case Component2=>Component2Version3()
案例组件3=>Component3Version5()
}
}
现在:

  • 为任何组件返回除
    版本
    以外的任何内容都是类型错误
  • 忘记匹配组件是一种非穷举匹配警告

    • 我做出以下假设:

      • 当有人创建管理器时,他们知道需要多少组件
      • 必须声明所有组件的版本
      trait必须显式地声明所有方法名,所以我们不能为我们不知道的组件声明方法。相反,让我们将组件建模为一种类型:

      trait组件管理器{
      类型组件
      def版本(组件:组件):版本
      }
      
      当有人知道他们需要什么组件时,他们可以实施管理器:

      密封特性MyComponent
      案例对象组件1扩展了MyComponent
      案例对象组件2扩展了MyComponent
      案例对象组件3扩展了MyComponent
      对象MyComponentManager扩展ComponentManager{
      类型组件=MyComponent
      def版本(组件:MyComponent):版本=组件匹配{
      case Component1=>Component1Version1()
      case Component2=>Component2Version3()
      案例组件3=>Component3Version5()
      }
      }
      
      现在:

      • 为任何组件返回除
        版本
        以外的任何内容都是类型错误
      • 忘记匹配组件是一种非穷举匹配警告

      全套组件何时已知?您可以声明一个省略了某些组件的管理器吗?这是未知的。随着系统的发展,将添加更多的组件。我说的是简化组件,但这是一个数据项目,所以实际上,中的每个组件都表示添加到抽象中的数据集操作。关于声明一个省略了组件的管理器,我不太确定这意味着什么。一件事是,每次添加一个组件时,它都已经被立即使用,所以我看不出这会如何改善我无助的处境。。。在你的情况下,这是众所周知的,在当时。对于特定版本的系统,您知道应该有哪些组件。是的,这是公平的。从长远来看,我试图做的是确保我的manager对象的完整性。随着其他开发人员的到来,除了审查过程之外,没有什么能阻止他们搞乱manager对象。我还希望我的用户访问manager对象,以便简单地“注册”他们的新数据集,但不要干预抽象本身的内层。我的结论是,我在这里陷入了僵局。我想你会同意我回答中的方法,在这里你必须向一个类型添加组件。什么时候知道完整的组件集?您可以声明一个省略了某些组件的管理器吗?这是未知的。随着系统的发展,将添加更多的组件。我说的是简化组件,但这是一个数据项目,所以实际上,中的每个组件都表示添加到抽象中的数据集操作。关于声明一个省略了组件的管理器,我不太确定这意味着什么。一件事是,每次添加一个组件时,它都已经被立即使用,所以我看不出这会如何改善我无助的处境。。。在你的情况下,这是众所周知的,在当时。对于特定版本的系统,您知道应该有哪些组件。是的,这是公平的。从长远来看,我试图做的是确保我的manager对象的完整性。随着其他开发人员的到来,除了审查过程之外,没有什么能阻止他们搞乱manager对象。我还可以让我的用户访问manager对象,以便简单地“注册”管理器