Ich habe einige Experimente auf dem Spielplatz gemacht und einige Schlussfolgerungen gezogen.
Zusammenfassung ![Bildbeschreibung hier eingeben]()
Wie Sie sehen können, ist es im Fall von class
die Verwendung von class func
oder static func
nur eine Frage der Gewohnheit.
Beispiel im Playground mit Erklärung:
class Dog {
final func identity() -> String {
return "Einmal ein Winsler, immer ein Winsler!"
}
class func talk() -> String {
return "Wuff wuff!"
}
static func eat() -> String {
return "Mjam mjam"
}
func sleep() -> String {
return "Zzz"
}
}
class Bulldog: Dog {
// Kann keine finale Funktion überschreiben
// override final func identity() -> String {
// return "Einmal ein Hund, aber jetzt bin ich eine Katze"
// }
// Kann keine "class func" überschreiben, aber neu deklarieren geht
func talk() -> String {
return "Ich bin ein Bulldog, und ich winsele nicht."
}
// Das gleiche wie "class func"
func eat() -> String {
return "Ich bin ein Bulldog, und ich esse nicht."
}
// Normale Funktion kann überschrieben werden
override func sleep() -> String {
return "Ich bin ein Bulldog, und ich schlafe nicht."
}
}
let hund = Dog()
let bulldogge = Bulldog()
// FINALE FUNKTION
//print(Dog.identity()) // Kompilierfehler
print(hund.identity()) // druckt "Einmal ein Winsler, immer ein Winsler!"
//print(Bulldog.identity()) // Kompilierfehler
print(bulldogge.identity()) // druckt "Einmal ein Winsler, immer ein Winsler!"
// => "final func" ist nur eine "normale" Funktion, die jedoch davon abhält, von Unterklassen überschrieben oder neu deklariert zu werden.
// CLASS FUNC
print(Dog.talk()) // druckt "Wuff wuff!", direkt von der Klasse aufgerufen
//print(hund.talk()) // Kompilierfehler, da "class func" dazu gedacht ist, direkt von der Klasse und nicht von einer Instanz aufgerufen zu werden.
print(Bulldog.talk()) // druckt "Wuff wuff!", da es von der Klasse Bulldog und nicht von der Instanz bullDogge aufgerufen wird.
print(bulldogge.talk()) // druckt "Ich bin ein Bulldog, und ich winsele nicht.", da talk() neu deklariert wird und von der Instanz bullDogge aufgerufen wird
// => "class func" ist wie eine "static" Funktion, die direkt von der Klasse oder einer abgeleiteten Klasse aufgerufen werden muss, neu deklariert werden kann, aber nicht zur Überschreibung gedacht ist.
// STATIC FUNC
print(Dog.eat()) // druckt "Mjam mjam"
//print(hund.eat()) // Kompilierfehler, da "static func" eine Typmethode ist
print(Bulldog.eat()) // druckt "Mjam mjam"
print(bulldogge.eat()) // druckt "Ich bin ein Bulldog, und ich esse nicht."
// NORMALE FUNKTION
//print(Dog.sleep()) // Kompilierfehler
print(hund.sleep()) // druckt "Zzz"
//print(Bulldog.sleep()) // Kompilierfehler
print(bulldogge.sleep()) // druckt "Ich bin ein Bulldog, und ich schlafe nicht."