2017-01-06 9 views
-1

サブクラス化されたオブジェクトを親クラスの静的配列に追加することは可能ですか?作成されたすべてのインスタンスに対して関数を実行したいと思います。別のSOの質問は、各インスタンスで関数を呼び出すために配列をループすることができると私はこれも私が望む最終結果だと思うが、私の問題はすべてのインスタンスを追跡する静的配列にインスタンスを取得しています。スワイプの静的配列にオブジェクトを追加する

もちろん私のコードは、よりモジュールであるが、ここでは、コードと階層の簡略図である。

class Jungle { 

    static var jungle: [Animals] = [] 

} 

class Tigers: Animals { 
    static var tigerPopulation: Int = 0 

    override init(name:String){ 
     super.init(name: name) 
     Tigers.tigerPopulation += 1 
    } 

    deinit { 
     Tigers.tigerPopulation -= 1 
    } 

} 

class Monkeys: Animals { 
    static var monkeysPopulation: Int = 0 


    override init(name: String){ 
     super.init(name: name) 
     Monkeys.monkeysPopulation += 1 
    } 
    deinit { 
     Monkeys.monkeysPopulation -= 1 

    } 

} 

class Snakes: Animals { 
    static var snakePopulation: Int = 0 

    override init(name: String){ 
     super.init(name: name) 
     Snakes.snakePopulation += 1 
    } 
    deinit { 
     Snakes.snakePopulation -= 1 
    } 
} 

私は彼らのすべてがジャングルからサブクラス化しますので、私は最初のジャングルクラスを作成しておく必要があり感覚を得ます私は推測するが、私はまだインスタンスを配列に取得する方法を困惑している。

+1

ちょうど 'Jungle.jungle.append'文句を言わない仕事:

次に、あなたがこのような何かあなたのジャングルのオブジェクトを使用したいですか? – Tj3n

+0

@ Tj3nもし私が各種のinit関数の中に入れたら、 "今作成されたばかりのインスタンスを追加する"とはどういう意味でしょうか?私はそれを書きましたが、各種のinit関数の中で何を追加するかについては正しく理解できませんでした。私はすべて一緒に間違って考えているかもしれません。 –

+2

あなたのコードは意味をなさない - Animalsクラスがないので、これらの他のクラスは何から派生していますか? – matt

答えて

2

イニシャライザの中から猿の数や虎の数などを増やすためにいくつかの動作をトリガーするのではなく、動物の配列にすべてを追加して動物アレイを使用していくつのタイガー/ Snakes/Monkeysあります。

単一の配列が異なる変数の束を持って、彼らは(例えばdeinitの間に減少させることにより)同期している作るよりも、長期的にはより簡単になるだろうことをオフにカウント基づか。ここで

はあなたのジャングル、動物、および動物のサブクラスのマイナーな改造です:

class Jungle { 

    var animals: [Animal] = [] 

    func addAnimal(animal: Animal) { 
     animals.append(animal) 
    } 

    // this is a computed property, everytime you access it 
    // via jungle.tigerPopulation, the code inside this statement 
    // executes, and you get the value that is returned 
    var tigerPopulation: Int { 

     // tigers is a new array containing only tigers 
     let tigers = animals.filter{ animal in 
      return animal is Tiger 
     } 

     // return the number of items in the tigers array 
     return tigers.count 
    } 
} 

class Animal { 
    let name: String 
    init(name: String) { 
     self.name = name 
    } 

    func sayHello() { 
     print("I'm an animal") 
    } 
} 

class Tiger: Animal { 
    // tiger specific stuff 
    override func sayHello() { 
     print("I'm a tiger called", name) 
    } 
} 

class Monkey: Animal { 
    // monkey specific stuff 
} 

class Snake: Animal { 
    // snake specific stuff 
    override func sayHello() { 
     print("I'm a snake called", name) 
    } 
} 

指摘する何かがあるため、動物のサブクラスのそれぞれは、現在(名前を割り当てる)同じことをやっているということですあなたドンサブクラスの初期化子をオーバーライドする必要はありません - これはクラス継承の値です!

動物は他の動物とは異なる何かを行う必要があります場合は、将来的に、時にはサブクラスをオーバーライドすることができます。

最も興味深いのはcomputed propertyです。animals配列のトラをフィルタリングして虎の個体数を計算し、カウントを返します。この方法では人口の数を手動ではなく+あなたがそれを求めるときはいつでもそれを計算する。

let jungle = Jungle() 
// jungle.animals -> [] 
// jungle.animals.count -> 0 
// jungle.tigerPopulation -> 0 

jungle.addAnimal(animal: Tiger(name: "Tony")) 
// jungle.animals -> [Tiger()] 
// jungle.animals.count -> 1 
// jungle.tigerPopulation -> 1 

jungle.addAnimal(animal: Snake(name: "Susan")) 
// jungle.animals -> [Tiger(), Snake()] 
// jungle.animals.count -> 2 
// jungle.tigerPopulation -> 1 


for animal in jungle.animals { 
    animal.sayHello() 
} 
// prints -> 
// I'm a tiger called Tony 
// I'm a snake called Susan 
+0

これは実際にどのようにしてより良い成果を上げられたかを知るのに役立ちます。私は感謝しています。私の最終目標は、単純にすべての動物の配列を持っていて、それをループして、すべての動物が自分のやり方や実装で共有する機能を呼び出すことでした。すべてのインスタンスで関数を呼び出すために、このように長いルートをとったと思いますか? –

+1

あなたは動物がジャングルに自分自身を加えることができます。動物の配列を作成しますが、コードを維持するのが混乱しにくく、終了することもあります。 Animal/Tiger/Snakeオブジェクトは、オブジェクトとして管理することを心配するだけで、次のレベル(ジャングル)はそれらを追加/削除する責任があります。 – MathewS

+1

また、sayHello()メソッドの例と、各動物のために動物配列を呼び出す方法と、動物ごとに若干異なるメッセージを作成する方法についても説明しました。あなたは、オブジェクト指向のパターンに関するいくつかのアイデアについては、このポストをチェックアウトすることがあります:https://www.raywenderlich.com/81952/intro-object-oriented-design-swift-part-1 – MathewS

関連する問題