覆盖方法 - 意外行为

时间:2017-11-28 20:41:31

标签: swift

我有这样的代码:

class A {
    func method() { print("method from A") }
}

class B: A {
    override func method() { print("method from B") }
}

class C: A {
    override func method() { print("method from C") }
}


func run (_ obj: A) {
    doIt(obj)
}

func doIt(_ obj: A) {
    print("specific logic when object of A class")
    obj.method()
}

func doIt(_ obj: B) {
    print("specific logic when object of B class")
    obj.method()
}

func doIt(_ obj: C) {
    print("specific logic when object of C class")
    obj.method()
}


let obj = C()
run(obj)

我得到了输出:

  

具体逻辑当来自C的A类方法的对象时

但我希望:

  

具体逻辑当C类方法的对象来自C

我应该如何更改代码才能获得此行为?

2 个答案:

答案 0 :(得分:2)

问题仅在于你已经使doIt三个松散的功能。相反,在三个类中创建三个方法

class A {
    func method() { print("method from A") }
    func doIt() {
        print("specific logic when object of A class")
        self.method()
    }
}

class B: A {
    override func method() { print("method from B") }
    override func doIt() {
        print("specific logic when object of B class")
        self.method()
    }
}

class C: A {
    override func method() { print("method from C") }
    override func doIt() {
        print("specific logic when object of C class")
        self.method()
    }
}


func run (_ obj: A) {
    obj.doIt()
}

现在,多态性可以帮到你。

答案 1 :(得分:1)

虽然多态是最好的方法,但这是另一种方法

class A {
    func method() { print("method from A") }
}

class B: A {
    override func method() { print("method from B") }
}

class C: A {
    override func method() { print("method from C") }
}


func run<T: A>(_ obj: T) {
    doIt(obj)
}

func doIt<T: A>(_ obj: T) {
    print("specific logic when object of \(T.self) class")
    obj.method()
}

let obj = C()
run(obj)