4

内部クラス/特性を外部クラス内または外部クラスから派生したクラス内に拡張できます。次のように、外部クラスの特定のインスタンスの内部クラスを拡張できます。

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

私が見る限り、typeパラメーターが外部クラスのインスタンスであるパラメーター化されたクラスを拡張しようとしているので、

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

それで、とにかく、外側の特性/クラスを参照せずに、外側の特性/クラスの内側にある内側のクラス/特性を拡張するのですか?

外部クラスのインスタンスがその型を宣言するだけで、派生した内部クラスをインスタンス化することは考えていません。

4

2 に答える 2

9

セルフタイプのトレイトを使用して、同様のことを行うことができます。たとえば、次のようなものがあるとします。

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

それはあなたが望むものではありませんが、近いです。

于 2012-06-09T21:12:35.467 に答える
3

正確には探しているものではありませんが、パス依存型(2.10または2.9で-Ydependent-method-typesフラグを使用して使用可能)を使用すると、次のことができます。

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

お役に立てば幸いです

于 2012-06-09T20:36:07.030 に答える