2012-11-09 113 views
3

在帶有內部類的Scala類中,如何聲明一個將該類的實例作爲參數的構造方法?以私有類實例作爲構造函數參數

即這個工程

class Element[T](val v : T, val next : Element[T]) 

class MyStack[T] private (private val first : Element[T]) { 
    def this() = this(null) 
    def push(v : T) = new MyStack[T](new Element[T](v,first)) 
    def pop() = new MyStack[T](first.next) 
    def top() = first.v 
} 

這不。

class MyStack[T] private (private val first : Element) { 
    private class Element(val v : T, val next : Element) 
    def this() = this(null) 
    def push(v : T) = new MyStack[T](new Element(v,first)) 
    def pop() = new MyStack[T](first.next) 
    def top() = first.v 
} 
+0

你究竟打算如何在MyStack之外實例化該類? '私人'修飾符直接抵觸你的目的 –

+0

呃......那裏有一個清晰可見的默認構造函數。 – Cubic

+0

哦,對。抱歉。您應該嘗試將'Element'放入伴侶對象中。但無論如何,這整個設計充滿了不合理的非常規決策:數十年前的古典「鏈表」的過度複雜的'null','Element' - 方法。我的意思是爲什麼不用'class MyStack [T](first:T,rest:MyStack [T])''沒有多餘的'Element'包裝?這個程序絕對需要審查我肯定會導致消除當前問題。 –

回答

2

由於Element無法從外面看到的,你應該是指它在外部類的背景下

class MyStack[T] private (first: MyStack[T]#Element) { 
    class Element(val v: T, val next: MyStack[T]#Element) 
    def this() = this(null) 
    def push(v: T) = new MyStack[T](new Element(v, first)) 
    def pop() = new MyStack[T](first.next) 
    def top() = first.v 
} 
+1

我想知道OP是否真的意味着在這裏創建一個內部類,因爲從他的例子來看,它似乎並不需要。 –

+0

我也想知道,但我沒有看到其他方式來解決這個問題。 – 4e6

+0

請注意,雖然你沒有在這裏將這個內部類私人化。 – Steve

1

我不知道你爲什麼想這樣做(你也許應該增加一些關於這方面的信息),但它可能,而不是私人內部類。參數本身必須是名稱調用,並且必須將其分配給惰性val,以便在外部實例準備就緒後才能對其進行評估。

class Foo[A](_x: => Foo[A]#Bar) { 
    lazy val x = _x 
    class Bar 
} 

scala> lazy val x: Foo[Int] = new Foo[Int](new x.Bar) 
x: Foo[Int] = <lazy> 

scala> x.x 
res8: Foo[Int]#Bar = [email protected] 
+0

這並不保證您只能傳遞指向外部實例的內部實例。例如,在你的例子之後,這也會編譯:'val y:Foo [Int] = new Foo [Int](new x.Bar)'。仍然很難知道OP的想法。 –

相關問題