【发布时间】:2015-10-05 02:53:25
【问题描述】:
我有以下设置:
trait A
{
def doSomething(): Unit;
}
object B extends A
{
override def doSomething(): Unit =
{
// Implementation
}
}
class B(creator: String) extends A
{
override def doSomething(): Unit =
{
B.doSomething() // Now this is just completely unnecessary, but the compiler of course insists upon implementing the method
}
}
现在你可能想知道我为什么要这样做,为什么我让类也扩展 trait。
问题是,在程序的某个地方有一个 A 的集合。 所以某处:
private val aList: ListBuffer[A] = new ListBuffer[A]
在那里,我还必须放 Bs(在其他衍生物中,即 C 和 D)
所以我不能让B级不扩展它。
由于所有实例的实现都是相同的,我想要使用一个对象。
但是我真的需要这个对象也是有原因的。因为有一个类:
abstract class Worker
{
def getAType(): A
def do(): Unit =
{
getAType().doSomething()
}
}
class WorkerA
{
def getAType(): A =
{
return B
}
}
这里返回 B 的单例/对象。这是在 Worker 中实现 do() 所必需的。
总结一下:
需要对象 B 是因为 do()(工人类)中的通用实现,也因为 doSomething() 永远不会改变。
需要类 B,因为在 BaseType A 的集合中,有不同作者的不同 B 实例。
由于上述原因,对象和类都必须实现特征,我在这里有点进退两难。我找不到看起来更整洁的令人满意的解决方案。
所以,我的问题是(事实证明,作为非母语人士,我应该进一步澄清这一点)
有没有办法让一个类扩展一个特征(或类)并说任何抽象方法的实现都应该在对象而不是类中查找,所以我必须只实现“doSomething()”(从特征)一次(在对象中)?正如我所说,这个特征在这里完成了两个不同的任务。 一个是 BaseType 以便集合可以获取该类的实例。另一个是确保 doSomething() 方法存在于每个对象中的合同。
所以对象 B需要扩展 trait,因为 trait 就像 Java 接口,每个(!)对象 B(或 C,或 D)需要有那个方法。 (所以我看到的唯一选项 -> 定义接口/特征并确保方法存在)
edit:以防万一。我是如何真正解决这个问题的:我实现了两个特征。
现在对于一个类(我需要它的地方)我扩展两者,而对于另一个我只扩展一个。所以我实际上从来不需要实现任何不是绝对必要的方法:)
【问题讨论】:
-
一个更具体的例子可能会有所帮助,你的代码太笼统了(
A,B,doSomething,...),很难帮助你。 -
您的问题是什么?我读了你的要求。拥有一个由对象和类扩展的特征看起来不错。你从不问任何事。您提到您找不到看起来“更整洁”的解决方案。 codereview.stackexchange.com 可以更好地解决您的问题吗?
-
@Madoc:假设代码与代码审查无关。
-
@Jamal 感谢您的澄清。只要什么都不问——而且我认为这个问题不是隐含的和显而易见的——它也不符合 SO 的问答格式。希望作者提出更明确的要求。
-
@Madoc:我希望我的编辑能澄清这一点!
标签: scala object collections singleton traits