2017-02-06 2 views
0

Ich habe eine Elternklasse mit einer Eigenschaft erstellt.
Jetzt bin ich inheriting diese Klasse in meine Kindklasse. Es ist offensichtlich, dass ein Mitglied der Elternklasse Mitglied der Kindklasse wird.
Also, wenn ich den Wert in der untergeordneten Klasse ändern, wird derselbe Variablenwert auch in der übergeordneten Klasse geändert.Kann Verhalten der Vererbung in swift nicht verstehen?

Ich habe unten erwähnten Code verwendet.

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" 

Hier Ausgang ist Bye aber es sollte sein Hallo wie ich nicht geordneten Klasse Mitglied Wert zu ändern bin.
Wenn ich mit Instanz SomeClass Zugriff dann zeigt es Ausgabe als Hallo

Wenig Fragen-

  • Ist es Kopie der übergeordneten Klasse Variable in der Kinderklasse oder refrence machen?
  • Super bedeutet, ich möchte auf die Variable der Elternklasse zugreifen, dann warum Wert geändert?

EDIT: Wie pro Frankie Antwort Im folgende Szenario, warum es immer noch gibt "Hallo".

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() 
+1

Hinweis: In 'Bclass' beziehen sich' self.avar' und 'super.avar' auf dieselbe Eigenschaft. – rmaddy

+0

aber Super soll auf Wert in der Elternklasse zugreifen, dann warum es den gleichen Wert wie self.It bedeutet, es macht Kopie, weil, wenn ich Wert von Elternklasse direkt ausdrucken dann zeigt es "Hallo" – iOSGuy

+1

'Bclass' erbt' avar' von seinem Elternteil Klasse. Es gibt nur den einen "Avar". – rmaddy

Antwort

4

Wenn Sie eine Instanz mit let c = Bclass() es schaffen, ist eine und nur eine Instanz erstellt. Es gibt keine "Superinstanz", die zusätzlich erstellt wird, so dass der Begriff Kopieren oder Referenz keinen Sinn ergibt.

Die Unterklasse erbt lediglich alle Eigenschaften und Funktionen der Superklasse oder, einfacher gesagt, erbt nur, was die Superklasse definiert. Daher sind self.avar und super.avar genau dasselbe.

Beispiel:

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' 
    } 
} 

EDIT

aus dem Bearbeiten des 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 
+0

ausgeben, können Sie jetzt erklären, was ist Das Thema ? – iOSGuy

+0

@iOSGuy Ich habe ein weiteres Update hinzugefügt – Frankie

+0

Ich bin immer noch verwirrt? – iOSGuy

1

A Unterklasse nimmt alle Eigenschaften, Funktion und Meth ods von seiner superklasse. Die Oberklasse ist eine Art Startpunkt/Grundlage für eine Unterklasse.

Zum Beispiel, wenn Sie einen normalen Viewcontroller erstellen, definieren Sie es als:

class mySubclass: UIViewController{ 
    // UIViewController's variables, properties, methods, functions... 
    // your code 
} 

können Sie sich vorstellen, dass der gesamte Code von der übergeordneten Klasse nun in der Unterklasse und liegt.Ein gutes Beispiel für die Nutzung könnten sein:

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" 

} 

Sie können sagen, dass die zweite Klasse ist eine Art der Anpassung für die übergeordnete Klasse, Kopieren und Ändern seiner Eigenschaften.

Verwandte Themen