我创建了一个具有一个属性的父类。
现在我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
几个问题 -
编辑:根据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()
答案 0 :(得分:4)
使用let c = Bclass()
创建实例时,只创建了一个实例。没有超级实例'这是另外创建的,因此复制或引用的概念没有意义。
子类只是继承了超类的所有属性和函数,或者更明显地,它只继承了定义超类的内容。因此,self.avar
和super.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"
}
你可以说第二类是超类的某种自定义,复制和更改它的属性。