无法理解swift中的继承行为?

时间:2017-02-06 04:51:12

标签: ios swift inheritance

我创建了一个具有一个属性的父类。
现在我inheriting这个班级进入我的孩子班。很明显,父类的成员将成为子类的成员。
因此,当我更改子类中的值时,父类中的相同变量值也会发生变化。

我使用了下面提到的代码。

class SomeClass {
    var avar:String = "Hello"
    var bvar:String?

    func someFunc() {

    }
}
class Bclass:SomeClass {
    func myFunc() {
        self.avar = "Bye"
        super.avar
    }
}

let c = Bclass()
c.myFunc()  // "Bye"

let d = SomeClass()
d.someFunc() // "Hello"

此处输出为再见,但它应为 Hello ,因为我没有更改父类成员值。
当我使用SomeClass的实例访问时,它会将输出显示为 Hello

几个问题 -

  • 是否在子类或参考中复制父类变量?
  • super表示我想访问父类的变量,然后为什么值会更改?

编辑:根据Frankie的回答 在下面的场景中,为什么它仍然打印" Hello"。

class SomeClass {
    var avar:String = "Hello"
    var bvar:String?

    func someFunc() {
        self.avar
    }
}

class Bclass:SomeClass {
    func myFunc() {
        self.avar = "Bye"
        super.avar
        self.avar
    }
}

class Cclass:SomeClass {
    func myFunc() {
        super.avar
        self.avar
    }
}

let c = Bclass()
c.myFunc()

let d = SomeClass()
d.someFunc()

let e = Cclass()
e.myFunc()

2 个答案:

答案 0 :(得分:4)

使用let c = Bclass()创建实例时,只创建了一个实例。没有超级实例'这是另外创建的,因此复制或引用的概念没有意义。

子类只是继承了超类的所有属性和函数,或者更明显地,它只继承了定义超类的内容。因此,self.avarsuper.avar完全相同。

示例:

class SomeClass {
    var avar: String = "Hello"
}

class Bclass: SomeClass {

    //imagine there is a (var avar: String = "Hello") here because it was defined in the super class

    func myFunc() {

        print(super.avar) //prints 'Hello'
        self.avar = "Bye"
        print(super.avar) //prints 'bye'
    }
}

修改

来自OP的编辑:

let c = Bclass()
c.myFunc() //assigns self.avar = "Bye", therefore prints "Bye"

let d = SomeClass()
d.someFunc() //does not make any assignment in someFunc, therefore prints the assigned value of "Hello"

let e = Cclass()
e.myFunc() //does not make any assignment in myFunc, therefore 'e' looks to its 
           //superclass for the value since it was never overridden and prints "Hello"
           //It does NOT look to 'c' for the value because 'c' is a completely separate instance

答案 1 :(得分:1)

子类使用 超类的所有属性,函数和方法 。超类是子类的某种起始位置/基础。

例如,当您创建普通的ViewController时,将其定义为:

class mySubclass: UIViewController{
    // UIViewController's variables, properties, methods, functions...
    // your code
}

您可以想象超类中的所有代码现在也位于子类中。使用的一个很好的例子可能是:

class Person{
    var name: String = ""
    var age: Int = 0
    var job: String? = ""
}

class John: Person {
     self.name = "John" // equivalent of super.name
     self.age = 26
     self.job = "Programmer"

}

你可以说第二类是超类的某种自定义,复制和更改它的属性。