Инициализаторы (init, super init)


#1
class Test {
    
    var a:Int
    var b:Int
    
    init(a:Int,b:Int) {
        self.a = a
        self.b = b
    }

}



class Second:Test {
    
    var z:Double
    
    init(z:Double) {
        self.z = z
        
        super.init(a: a, b: b)  - Use of 'self' in property access 'a' before super.init initializes self
    }
    
}

Что то совсем не могу понять как работать с инициализатором
Напишите код, для двух случаев:

  1. если надо в подклассе переопределись свойство, оставить только одно, новое z
  2. если в подклассе надо добавить новое свойство, что бы их было a b z

#2

super.init(a: 1, b: 2)


#3

т е должны быть заданы значения свойств предка? а типа как то опередить их через self нельзя ?


#4
class Second:Test {
    var z: Double
    
    init(z:Double, a:Int, b:Int) {
        self.z = z
        self.a = a   ошибка!!! Use of 'self' in property access 'a' before super.init initializes self
        self.b = b   ошибка!!! Use of 'self' in property access 'a' before super.init initializes self
       super.init(a:a , b: b)
    
    }
}

как написать что бы при создании объекта с типом Second, надо было проинициалировать a b z свойства ? или так нельзя ?


#5

нельзя, потому что любые поля супер класса не доступены до вызова super.

class Test {

var a:Int
var b:Int

init() {
	a = 0
	b = 0
}
init(a:Int,b:Int) {
    self.a = a
    self.b = b
}
}

class Second:Test {

var z:Double

init(z:Double) {
    self.z = z
	super.init()
	self.a = 1
	self.b = 2
}
}

решить можно например так, что то же самое что и
class Test {

var a:Int = 0
var b:Int = 0

init() {
	
}
init(a:Int,b:Int) {
    self.a = a
    self.b = b
}
}

class Second:Test {

var z:Double

init(z:Double) {
    self.z = z
	super.init()
	self.a = 1
	self.b = 2
}
}

#6

Вот я может не правильно вопрос задаю или что то не понимаю.

class Triangle {
    var a:Int
    var b:Int
    var c:Int
    
    init (a:Int, b:Int, c:Int){
    self.a = a
    self.b = b
    self.c = c
    }
}



class Righttriangle:Triangle {
    
    var angle:Int
    
    какой сюда код написать -
    пусть инициализируются
    стороны (a,b,c) как у супер
    класса, (но только значения по умолчанию не нужны)
    и у меня есть новое
    свойство angle:Int
    
    
}

#7

[quote=“DyaDya709, post:6, topic:2863”]
пусть инициализируются
стороны (a,b,c) как у супер
класса, (но только значения по умолчанию не нужны)
[/quote]тут ошибка в логике. ты хочешь инициализировать свойства abc, установив значения по умолчанию, не устанавливая значения по умолчанию.

не говоря о том, что ты хочешь переменной задать то же самое значение. а смысл его менять если оно то же самое?

class Test {
	var a:Int! = nil
	var b:Int! = nil

	init() {

	}
	init(a:Int,b:Int) {
		self.a = a
		self.b = b
	}
}

class Second:Test {
	var z:Double

	init(z:Double) {
		self.z = z
		super.init()
		self.a = a
		self.b = b
	}
}

типа перестань заниматься бредом, сказал же “любые поля супер класса не доступены до вызова super”