2017-06-06 48 views
1

如果我有一個子類,怎麼可能拒絕一個func與其他參數的訪問?在Swift中,用參數覆蓋func。添加目標到項目

更容易與代碼解釋:

class A { 
    func printSometing() { 
     print("Class A printing") 
    } 
} 

class B: A { 
    override func printSometing() { 
     print("Class B printing") 
    } 
} 

class C: A { 
    func printSometing(withPar:String) { 
     print("Class C printing" + withPar) 
    } 
} 

let prA = A() 
prA.printSometing() 

let prB = B() 
prB.printSometing() 

let prC = C() 
prC.printSometing() //I don't won't that C can print this 
prC.printSometing(withPar: " my free par") 

的印痕:

prA prints: Class A printing 
prB prints: Class B printing 
prC prints: Class A printing 
prC prints: Class C printing my free par 

好,是正常的,但我怎麼能避免中國可打印 「A級打印」?

周圍的工作就是寫:

class C: A { 
    func printSometing(withPar:String) { 
     print("Class C printing" + withPar) 
    } 
    override func printSometing() {} 
} 

但我不會說誰在使用與C類FUNC printSometing,被迫只能使用樂趣printSometing(withPar:字符串),而不是printSometing ()

我相信有一個解決方案。

UPDATE:

如果沒有解決方案,我認爲唯一的解決辦法,迫使它是:

class C: A { 
     var myPar:String 
     init (withPar:String) { 
      self.myPar = withPar 
     } 
     func printSometing(withPar:String) { 
      print("Class C printing" + withPar) 
     } 
     override func printSometing() { 
      printSometing(withPar: myPar) 
     } 
} 

讓我知道感謝

UPDATE:我的理由

好的我會解釋。我正在進行一場比賽,在我重複目標的項目中。所以一些文件在兩個目標中是共同的,其他一些沒有。例子GameScene.swift是不同的。在新的目標中,我想製作相同的遊戲,但差異很小。 示例我在播放器中添加了一些功能,但我不會保留原始文件。如果我更改了目標1中的Player.swift,則目標2中的更改也相同。這是因爲Player2類與Player的90%相同。如果我在播放器中改變一些func,Player2也會改變。

目標1:GameScene.swift

目標1和目標2:Player.swift

目標2:Player2.swift

class Player: SKNode { 
    //All my stuff 
    func shot() { 
     //bla bla bla 
    } 
} 
class Player2: Player { 
    override init() { 
     //Different physics etc 
    } 
    func shot(withColor: SKColor) { 
     //bla bla bla 
    }  
    //All other func of Player.swift are available, ok I whant this. 
} 

現在是什麼問題? 在可能GameScene.swift的目標2中,我可以調用shot()。但對於新遊戲來說,只需要調用func shot(withColor:SKColor)。 好吧,我知道這一點,並足夠不要叫shot()。但我在想,明天我會忘記這一點。

另一個解決方法是複製target2中的所有Player.swift。但是,如果我將在target1的Player.swift中添加一個func,則func不會出現在target2中。

是我第一次在項目中使用2個目標,我一定會正確地做到這一點。 由於

+5

沒有辦法做到這一點,它會破壞里氏替換原則 – dan

+0

謝謝@丹,請檢查我的更新來了解,如果是繼續的唯一途徑。 –

+0

你的問題不是這*不能做*,而是它*不應該*。這只是沒有意義。你究竟想達到什麼目的? – Alexander

回答

1

Wikipedia

可替代性在面向對象的編程說明的是,在一個計算機程序中,如果S是T的子類型,則類型T的對象可以被替換爲一個原理S型的對象,而無需改變任何T的期望的性質(即類型T的對象可以與亞型S的任何物體取代)

這就是所謂的Liskov替換原則(因爲@ dan在評論中指出),唯一不會因爲想要達到目標而破壞它的方法是通過暴力破解,或者使用您在問題編輯中提供的代碼,使用以下代碼它們是等價的,而不會產生不需要的變量):

class C: A { 
    override func printSometing() { 
     print("Class C printing") 
    } 
    func printSometing(withPar:String) { 
     print("Class C printing" + withPar) 
    } 
} 
+0

當然,但我的問題不是這個簡單的打印:)。我正在從我的應用程序 –

+0

@SimonePistecchia創建一個新目標,那真的不是很愉快......希望你能找到一種方法來做到這一點,也許避免'class'?不知道該說些什麼,應用程序目標並不是我的特長。 –

+0

我已經添加了目標解釋 –