2017-02-06 2 views
0

1つのプロパティを持つ親クラスを作成しました。
今、私は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" 

ここで、出力はバイバイですが、私は親クラスメンバーの値を変更していないよと、それは、こんにちはでなければなりません。
私はSomeClassのインスタンスにアクセスし、それを示して、それは子クラスまたはrefrenceに親クラス変数のコピーを作成していこんにちは

少数questions-

  • として出力?
  • スーパーは、親クラスの変数にアクセスしたいのですが、なぜ値が変更されたのですか?

EDIT:以下のシナリオではフランキーの答え 1として、なぜそれまだ版画「こんにちは」。

+1

ヒント: 'Bclass'では、' self.avar'と 'super.avar'は同じプロパティへの参照です。 – rmaddy

+0

親クラスの値にアクセスすることになっているスーパーは、なぜselfと同じ値を出力するのでしょうか?親クラスからの値を直接出力すると "hello"を表示するのでcopyを意味します – iOSGuy

+1

'Bclass'は親から' avar'クラス。 1つだけ 'avar'があります。 – rmaddy

答えて

4

let c = Bclass()でインスタンスを作成すると、インスタンスが1つしか作成されません。追加的に作成される「スーパーインスタンス」は存在しないので、コピーまたは参照の概念は意味をなさない。

サブクラスは、スーパークラスのすべてのプロパティと関数を継承するか、またはより明示的にスーパークラスを定義するものだけを継承します。したがって、self.avarsuper.avarはまったく同じものです。

例:OPの編集から

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

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

問題 ? – iOSGuy

+0

@iOSGuy別のアップデートを追加しました – Frankie

+0

まだ混乱していますか? – iOSGuy

1

サブクラスを取るの特性、機能およびメタのすべてodsスーパークラス。スーパークラスは、サブクラスの開始場所/基盤の一種です。例えば

あなたが通常の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" 

} 

あなたは番目のクラスは、そのプロパティをコピーして変更し、スーパークラスのカスタマイズのいくつかの種類であると言うことができます。

関連する問題