在Swift中,用参数覆盖func。添加目标到项目

问题描述:

如果我有一个子类,怎么可能拒绝一个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

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

我已经添加了目标解释 –