在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个目标,我一定会正确地做到这一点。 由于
可替代性在面向对象的编程说明的是,在一个计算机程序中,如果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)
}
}
当然,但我的问题不是这个简单的打印:)。我正在从我的应用程序 –
@SimonePistecchia创建一个新目标,那真的不是很愉快......希望你能找到一种方法来做到这一点,也许避免'class'?不知道该说些什么,应用程序目标并不是我的特长。 –
我已经添加了目标解释 –
没有办法做到这一点,它会破坏里氏替换原则 – dan
谢谢@丹,请检查我的更新来了解,如果是继续的唯一途径。 –
你的问题不是这*不能做*,而是它*不应该*。这只是没有意义。你究竟想达到什么目的? – Alexander