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

Ios 无法理解swift中的继承行为?,ios,swift,inheritance,Ios,Swift,Inheritance,我创建了一个具有一个属性的父类。现在我将这个类继承到我的子类中。很明显,父类的成员将成为子类的成员。所以,当我更改子类中的值时,父类中的相同变量值也会更改 我使用了下面提到的代码 class SomeClass { var avar:String = "Hello" var bvar:String? func someFunc() { } } class Bclass:SomeClass { func myFunc() { self.a

我创建了一个具有一个属性的父类。现在我将这个类继承到我的子类中。很明显,父类的成员将成为子类的成员。所以,当我更改子类中的值时,父类中的相同变量值也会更改

我使用了下面提到的代码

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"
这里的输出是Bye,但应该是Hello,因为我并没有更改父类成员值。当我使用SomeClass的实例访问时,它将输出显示为Hello

几个问题-

它是否在子类或引用中复制父类变量? super意味着我想访问父类的变量,那个么为什么值会改变呢? 编辑:根据弗兰基的回答 在下面的场景中,为什么它仍然打印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()

当您使用let c=Bclass创建实例时,将创建一个且仅创建一个实例。没有额外创建的“超级实例”,因此复制或引用的概念没有意义

子类只继承超类的所有属性和函数,或者更简单地说,它只继承定义超类的内容。因此self.avar和super.avar是完全相同的东西

例如:

编辑

从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

当您使用let c=Bclass创建实例时,将创建一个且仅创建一个实例。没有额外创建的“超级实例”,因此复制或引用的概念没有意义

子类只继承超类的所有属性和函数,或者更简单地说,它只继承定义超类的内容。因此self.avar和super.avar是完全相同的东西

例如:

编辑

从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
子类接受其超类的所有属性、函数和方法。超类是一个子类的起始位置/基础。 例如,创建普通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"

}
可以说,第二个类是超类的某种定制,复制和更改其属性。

子类获取其超类的所有属性、函数和方法。超类是一个子类的起始位置/基础。 例如,创建普通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"

}

可以说,第二个类是超类的某种定制,复制并更改其属性。

提示:在b类中,self.avar和super.avar是对同一属性的相同引用。但是super应该访问父类中的值,那么为什么它会打印与self相同的值。这意味着它会进行复制,因为当我直接打印父类中的值时,它显示helloBclass从其父类继承了avar。只有一个avar。它是副本还是参考发送给子类?你能让你的编辑更清楚你在观察/询问/仍然困惑什么吗?提示:在B类中,self.avar和super.avar是对同一属性的相同引用。但是super应该访问父类中的值,那么为什么它会打印与self相同的值。这意味着它会进行复制,因为当我直接打印父类中的值时,它显示helloBclass从其父类继承了avar。只有一个avar。它是发送给子类的副本还是引用?你能让你的编辑更清楚地了解你正在观察/询问/仍然困惑什么吗?现在你能解释问题是什么吗?我仍然困惑?我仍然困惑?为什么super.avar打印bye。如果它要打印bye,那么super.avar.in java I有什么用已研究的super.avar将在父类中打印值。super.avar的使用是为了使您不必总是为self.avar分配一个值来获取“Hello”。但是,当您重写子类中的self.avar并给它一个新值时,super.avar就有了这个新值,因为它引用了同一个对象。我可以通过self.avar或super.avar获得。你现在可以解释问题是什么吗?我仍然困惑?我仍然困惑?为什么super.avar打印bye。如果它要打印bye,那么super.avar有什么用途。在java中,我研究了super.avar,它将在父类中打印值。super.avar的使用是为了让你不必总是分配self.avar值仅用于获取“Hello”。但是,当您重写子类中的self.avar并给它一个新值时,super.avar就有了这个新值,因为它引用了同一个对象。我可以通过self.avar或super.avar获得