2015-06-21 47 views
1

我在Xcode中使用Playground,並且我的對象沒有使用它們的名稱進行初始化。我覺得這是因爲我在我的sublcasses中錯誤地使用了便利的init,我想知道在子類中使用它們的正確方法是什麼。我已閱讀其他類似問題,但我認爲我的問題與overriding initsconvenience inits的方式不同。在子類中使用便捷初始化(Swift)

class Animal 
{ 
    var name:String 

    init(name:String) 
    { 
     self.name = name 
    } 

    convenience init() { self.init(name: "") } 

    func speak() { } 
} 

class Fox: Animal 
{ 
    override init(name: String) 
    { 
     super.init(name: name) 
    } 

    convenience init() { self.init(name: "Fox") } 

    override func speak() 
    { 
     println("Ring") 
    } 
} 

class Cat: Animal 
{ 
    override init(name: String) 
    { 
     super.init(name: name) 
    } 

    convenience init() { self.init(name:"Cat") } 

    override func speak() { 
     println("Meow") 
    } 
} 

class Dog: Animal { 
    override init(name: String) { 
     super.init(name: name) 
    } 

    convenience init() 
    { 
     self.init(name:"Dog") 
    } 

    override func speak() { 
     println("Woof") 
    } 
} 

let animals = [ Dog(), Cat(), Fox()] 
for animal in animals 
{ 
    animal.speak() 
} 
+0

什麼問題?你在動物中的動物......對我很有用。你不需要在子類中覆蓋init,但是當你重寫時,這不是問題。 – GoZoner

+0

speak()無法正常工作。我得到的輸出是: – stumped

+0

__lldb_expr_13.Dog __lldb_expr_13.Cat __lldb_expr_13.Fox – stumped

回答

0

代碼中沒有錯誤。 我認爲問題在於瞭解Xcode的操場是如何工作的。 也許你已經按「顯示結果」圖標,你在像這樣看:

show result

但是這是在告訴我們,「模塊名稱」點「類名」三隻動物;前綴__lldb_expr_25(在我的照片中)is not an error,但動態模塊名稱在操場上沒問題。

事實上,你應該看看「助理編輯」

assistant editor menu

看到斑點的輸出()方法:

output1

這可能是更發音與代碼稍作修改:

code modification

所以輸出:

new output

0

讓我根據回答到目前爲止,我的理解 -

覆蓋inits就像是替換同向同一個超類的init方法。在這裏,你可以不添加額外的行爲作爲一個init方法參數如:

如果你想實現一個init方法到子類
class Animal 
{ 
    var name:String 

    init(name:String) 
    { 
     self.name = name 
    } 

    func speak() { } 
} 

class Cat: Animal 
{ 
    override init(name: String) 
    { 
     super.init(name: name) 
    } 

    override func speak() { 
     println("Meow") 
    } 
} 

方便inits就像是子類的自定義的init方法手段,但帶有一些額外的行爲以及超類init方法。如:

class Animal 
    { 
     var name:String 

     init(name:String) 
     { 
      self.name = name 
     } 

     func speak() { } 
    } 

    class Cat: Animal 
    { 
     var type: String = "Maine Coons" 
     convenience init(type:string, name: String) 
     { 
      self.type = type 
      self.init(name: name) 
     } 

     override func speak() { 
      println("Meow") 
     } 
    } 

我希望它能幫助你。 謝謝

相關問題