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获得