【问题标题】:Scala: Extending inner class, without reference to outer classScala:扩展内部类,不参考外部类
【发布时间】:2012-06-13 09:39:04
【问题描述】:

我可以在外部类或从外部类派生的类内部扩展内部类/特征。我可以扩展外部类的特定实例的内部类,如下所示:

class Outer
{
  class Inner{}
}

class OtherCl(val outer1: Outer)
{
  class InnA extends outer1.Inner{}
}

注意:即使这样似乎也可以很好地编译产生非常有趣的可能性:

trait OuterA
{ trait InnerA } 

trait OuterB
{ trait InnerB }

class class2(val outerA1: OuterA, val outerB1: OuterB)
{ class Inner2 extends outerA1.InnerA with outerB1.InnerB }

但这不会编译:

class OtherCl extends Outer#Inner

据我所知,我正在尝试扩展一个参数化类,其中类型参数是外部类的一个实例,因此效果如下

class OtherCl[T where T is instance of Outer] extends T.Inner

那么在不引用外部特征/类的情况下扩展位于外部特征/类内部的内部类/特征吗?

我不希望在没有外部类实例的情况下实例化派生内部类,只声明其类型。

【问题讨论】:

  • 如果内部类引用外部类的成员,您希望行为是什么?
  • @TravisBrown 和往常一样。我不想在没有外部类实例的情况下实例化派生内部类,只声明它的类型。

标签: scala inner-classes


【解决方案1】:

您可以使用带有self-type 的特征来做类似的事情。例如,假设我们有以下内容:

class Outer(val x: Int) {
  class Inner {
    def y = x
  }
}

我们想在Inner 中添加一些功能,而不需要Outer

trait MyInner { this: Outer#Inner =>
  def myDoubledY = this.y * 2
}

现在,当我们实例化 Inner 时,我们可以混入 MyInner

scala> val o = new Outer(21)
o: Outer = Outer@72ee303f

scala> val i = new o.Inner with MyInner
i: o.Inner with MyInner = $anon$1@2c7e9758

scala> i.myDoubledY
res0: Int = 42

这不是你想要的,但很接近。

【讨论】:

  • 干杯,我将不得不玩弄它,因为我的代码更加复杂。我不确定我是否已经尝试过类似的方法。
【解决方案2】:

不完全是您要查找的内容,但具有路径相关类型(可在 2.10 或 2.9 上使用 -Ydependent-method-types 标志,您可以这样做:

class Outer { class Inner {}; def create = new Inner }
def foo[T <: Outer](x: T) = x.create

希望对你有帮助

【讨论】:

  • 啊。我刚刚计时了。我第一次接触 Scala 是在 2.9.2 Final。我只是假设路径相关类型自 2.8 以来已完全启用,并且我正在使用一个非常成熟的功能。
猜你喜欢
  • 1970-01-01
  • 2016-04-08
  • 2015-09-28
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 2013-10-21
  • 2014-06-30
  • 2013-01-10
相关资源
最近更新 更多