‫このビデオでは､ より高度なショップ開発者になるために理解しておくべき､
‫非常に重要なインターフェイスを紹介します｡
‫そして､ それはAI enumerableインターフェースだけでなく､ AI enumeratorインターフェースでもある｡
‫ですから､ このビデオを見る前にインターフェイスを理解しておく必要があります｡ そうでないと､ いくつかのコンセプトが潜在的に意味をなさなくなるからです｡
‫ですから､ 私たちが提供するインターフェイスのビデオもぜひご覧になってください｡
‫なるほど｡
‫つまり､ AI enumerableインターフェースは､ Cシャープにおける多くのコレクションの基本インターフェースであり､ その仕事は､
‫コレクションを反復処理する方法を提供することです｡
‫このように､ リストや辞書を通過するループは､ enumerableインターフェイスを継承しているので､ for each
‫loopを使うことができるのです｡
‫つまり､ 簡単に言うと､ コレクションクラスがAIのenumerableインタフェースを実装すると､
‫countableになり､ その中の各要素を個別に数えることができるようになるわけです｡
‫つまり､ AI列挙型インターフェースには2種類のバージョンが存在するのです｡
‫1つは､ AI列挙可能な開き括弧と閉じ括弧を持つ一般的なコレクションで動作するもので､ もう1つは､
‫非一般的なコレクション用のAI列挙可能なインターフェースです｡
‫ですから､ ジェネリックコレクションとノンジェネリックコレクションの意味も理解しておく必要があります｡
‫それなりのメリット・デメリットがあるのですが､ それも動画で紹介しています｡
‫そうでないとちょっとややこしいので､ このビデオを見る前に見ておいてほしいです｡
‫なるほど｡
‫では､ この2つを見てみましょう｡
‫ジェネリックコレクションは非ジェネリックコレクションの後に導入されたので､ ジェネリックコレクションを使用することが推奨されます｡
‫いわば､ 基本的には改良版ということになりますね｡
‫そのため､ 新しいプロジェクトを作成する場合は､ ジェネリック版を使用することをお勧めします｡ ジェネリックでないコレクションに対するI
‫enumerableは､ ボックス化とアンボックス化､ つまり基本的にはオブジェクトの型の変換を適用または実行する必要があるためです｡
‫また､ AI列挙型ttyインターフェースの使い方は後ほど説明します｡
‫なぜなら､ 箱詰めと箱出しが必要で､
‫効率が悪いからです｡
‫では次に､ AI enumerableとAI enumeratorの違いについて見てみましょう｡
‫もしかしたら､ あなたも聞いたことがあるかもしれませんね｡
‫AI enumerableインターフェースには､ このインターフェースを実装する際に必ず実装しなければならないメソッドが1つあり､
‫ここでの特別な例ではそれを後で行うことになります｡
‫だから､ もっともっと意味があるんです｡
‫そこで､ 実装する必要があるのがget enumerateメソッドで､ これはAI enumeratorオブジェクトを返します｡
‫したがって､ AI列挙体をクラスで使いたい場合､ あるいはクラスで実装したい場合､
‫このメソッドを実装する必要があります｡
‫だから､ AI列伝｡
‫コレクション内の現在いるオブジェクトを指す current プロパティを公開することで､ コレクションを繰り返し使用する機能を提供する｡
‫これは､ 実際にこの例で実行すると､ もっと複雑になります｡
‫そこで､ これらの意味を十分に理解した上で､ 例を作っていくことにします｡
‫ですから､ これはあくまで期待するものを用意するためのものです｡
‫では､ さっそく始めましょう｡
‫さて､ このような理屈は抜きにして､ 実際に実践してみましょう｡
‫では､ このdogという小さなクラスを作りましょう｡
‫そして､ シンプルにするために同じファイルに入れることにしています｡
‫つまり､ Dogという名前のクラスと､ is Naughty Dogというブール値を用意しました｡
‫ですから､ 基本的には犬がやんちゃかどうかをチェックすることになります｡
‫それを踏まえて､ おやつをあげることにしています｡
‫だから､ やんちゃな犬でなければ､ 良い子や良い犬である場合よりもおやつをもらえる回数が少なくなる｡
‫つまり､ このコンストラクタは基本的にこれら2つの値を設定するだけです｡
‫そこで､ 犬のオブジェクトを作るときに､ 名前と､ 犬がいたずらしたかどうかのブール値を与えることにします｡
‫そして､ このギフト・トリーツの方法ですが､ これは基本的に犬がWoofと言ったのをプリントアウトするだけです｡
‫だから､ 犬がおやつをもらうたびに､ Woofと言うようになるのです｡
‫ですから､ 基本的に良い犬であれば､ おやつを2回もらうと2回動くことになります｡
‫また､ 悪い犬やいたずらな犬であれば､ おやつが少なくなるので､ 一回しか動きません｡
‫なるほど｡
‫さて､ これでこのクラスDockができあがりましたので､ さっそく犬のオブジェクトを作成してみましょう｡
‫では､ この別のクラスを用意しましょう｡
‫リストの中で犬を使う別のクラスがあると仮定しましょう｡
‫そこで､ このドッグシェルター教室を開催しています｡
‫そこで､ このドッグシェルター講座では､ 犬のリストを用意します｡
‫したがって､ リストが一般的なコレクションであるため､ システム・コレクション・ジェネリックを使用していることを確認する必要があります｡
‫このように､ 上部にあるのは､ システムコレクションのジェネリックを使用しているところです｡
‫なるほど｡
‫さて､ このドッグシェルターのコンストラクタには犬のリストがありますが､ これからすることは､
‫この犬のリストをたくさんの犬で初期化することだけです｡
‫そこで､ キャスパー犬､ あるいはキャスパーと呼ばれる犬を飼うことにしました｡
‫老犬ではありませんが､ やんちゃな犬ならオレオもやんちゃじゃないし､ ピクセルもやんちゃじゃないです｡
‫どうやって名前をつけたかは聞かないでください｡
‫もちろん､ このアプリケーション全体をもっと複雑にすることもできますが､ 私たちが考えているのは､
‫この犬のリストを使って､ ドッグシェルター内を繰り返し移動することだけなのです｡
‫そして､ 犬が良い子かそうでないか､ やんちゃな犬かそうでないかで､ おやつを1つあげたり､ 2つあげたりするのです｡
‫それでは､ mainメソッドに移動しましょう｡ ここがアプリケーションの出発点です｡
‫そして､ この時点で､ ここに犬のシェルターを作って行きましょう｡
‫わかりました｡
‫そこで､ このシェルターという犬の保護施設を持っています｡
‫シェルターオブジェクトには犬のリストが含まれるので､ このシェルターオブジェクトを使えるように､
‫これもすぐに初期化します｡
‫そうですね｡
‫さて､ ここでやりたいことは､ リストを繰り返し見て､ おやつをあげたいのかあげないのかをチェックすることです｡
‫そこで､ ここではダブルタブのようにそれぞれを作成し､ 準備することにしましょう｡
‫では､ 私たちが通過するのは何なのか｡
‫まあ､ 犬のことはスルーです｡
‫そして､ 犬を呼ぶことになる｡
‫だから､ リストの中の項目はすべて犬になる｡
‫そして､ 通したいコレクションは､ 実は､ シェルターになるんです｡
‫ようなものです｡
‫そこで今､ ちょっとした問題が発生しています｡
‫しかし､ dog shelterにはget enumeratorのパブリックインスタンスや拡張定義がないため､
‫for each文はdog shelter型の変数を操作することができません｡
‫さて､ これでget列挙子ができました｡
‫ということは､ どういうことでしょうか？
‫つまり､ この犬用シェルターには反復処理したいリストがあるので､ この犬用シェルター用にインターフェースI enumerableを実装する必要があるということです｡
‫そうだろ？
‫というのも､ シェルター､ まあ､ うちの犬のシェルターなんですが､ それを反復させたいんです｡
‫そして､ 反復可能にするために､ ここでAIのenumerableを実装する必要があります｡
‫また､ どのような種類のオブジェクトを列挙するのか？
‫まあ､ うちの場合､ 犬になるんですけどね｡
‫犬用シェルターの中で犬を調べたいのですが､ 犬用シェルターのコンストラクタで初期化されている犬用リストがあります｡
‫そして､ そのすべてに目を通し､ 犬を撫でたり､ 私たちの場合はおやつをあげたりと､
‫犬と一緒に何かをすることができるようにしたいのです｡
‫だから､ これを実装してここに上がれば､ エラーはなくなる｡
‫というのも､ 私たちのシェルターは､ 犬のシェルターですが､ 今､ 実施する必要があるという指示を受けたので､
‫突然､ 大丈夫です｡
‫ここに列挙しました｡
‫このドキュメントがあるので､ これが一般的なI enumerableです｡
‫そうだろ？
‫だって､ これじゃないんだもん｡
‫与えているタイプのものです｡
‫しかし､ 今､ その上にカーソルを置くと､ 別のエラーが表示されることがわかります｡
‫doc shelterはインターフェイスメンバーを実装していないと書かれています｡
‫I enumerable doc get enumeratorとI enumerable get enumeratorがあるので､ 手動で入れることができるのです｡
‫しかし､ IDを使うことの良さは､ IDが多くの作業を代行してくれることです｡ 修正候補を表示して､
‫すべてのメンバーを明示的に実装するをクリックすると､ コレクションの名前空間が追加され､
‫2つのメソッドや2つのメンバーの追加を代行してくれるのです｡
‫これをクリックすると､ このエラーが消えるのがわかりますね｡
‫さらに下にスクロールしていくと､ 今度はdoc型の列挙子と非汎用I列挙子コレクションを返していることがわかります｡
‫だから､ 今は実装していないんです｡
‫そのため､ ここではthrow new not implemented xという例外を発生させています｡
‫だから､ ここで変えていく必要があるんです｡
‫これで､ get enumerator メソッドが呼ばれたときに何が起こるかを実装することができます｡
‫だから､ それを解決するために､ ここで言うのは､ ただ返すだけです｡
‫Dogs our list dogs dot get enumerator ちょうどこのような感じです｡
‫そしてこれが実装となります｡ なぜなら､ 私たちのドッグシェルターは今､ 列挙可能なインターフェイスを実装しているからです｡
‫そして､ ここにあるリストは､ 実は､ A､ カーソルを合わせると､ リストというのは一般的なリストなんです｡
‫そして､ これらの犬のリストを取得し､ 各グループが通過するすべての反復処理の列挙子を取得することができるようになりました｡
‫ですから､ 基本的には犬の個体を返すことになります｡
‫そして今度は､ この犬を各ループの中で実際に使ってみましょう｡
‫ということは､ 基本的にこれで犬がいたずらしないかどうかを確認することができるようになったということです｡
‫だから､ ドッグドットはやんちゃではないんです｡
‫そうすると､ 基本的には犬がいたずらをしていなければ､ give treatというメソッドを呼んで､
‫おやつを2つあげるということになります｡
‫そうでなくても､ やんちゃな子には､ おやつをあげないわけにはいきませんからね､ 私たちは犬が好きすぎるんです｡
‫こんな感じで､ 1回だけおやつをあげることにしています｡
‫そして､ この時点で､ アプリケーションを実行することができます｡
‫そして､ 私たちは見るでしょう｡
‫キャスパーはウルフを2回､ 自分は良い犬だから､ スニフはいたずらな犬だから､ おやつは1回だけで､
‫ウフフと言い､ 1回オレオが2回､ ピクセルが同じく2回動くのです｡
‫わかりました｡
‫そして､ 基本的にはこのように､ クラスを指示に従わせるか､ AI enumerableを実装して､ 例えばここにあるようなfor
‫eachループを使ってリストをループすることができるようにするのです｡
‫さて､ なぜAI列挙型でゲート列挙器を実装しないのか､ ジェネリックでない列挙型なのか､ と疑問に思われるかもしれません｡
‫まあ､ それは非ジェネリックの例を使わないからで､ 犬のシェルターも非ジェネリックではありませんが､
‫ただ､ AI enumerableインターフェースを使うときは実装する必要があります｡ そうしないと､ それを取り除くと､
‫またここで警告が出ますから｡
‫ここで､ 実際にエラーになっているのがわかると思いますので､ このメソッドもしっかり入れておく必要があります｡
‫わかりました｡
‫というわけで､ 今回の動画はここまでです｡
‫そして､ 次のビデオでは､ さらに無数の目を活用した別の例を見ていきます｡
‫ということで､ ちょっとだけご紹介しました｡
‫このトピックはかなり複雑でややこしいのですが､ もう少し活用しましょう｡
‫ところで､ ここでちょっとだけ､ まとめておきますね｡
‫AI enumerableインターフェースは､ どのような場合に使用することが推奨されますか？
‫まあ､ コレクションが巨大なデータベース・テーブルを表しているときに使うべきでしょう｡
‫つまり､ データベースが巨大化する可能性があるため､ 全体をメモリにコピーしてアプリケーションの性能問題を起こしたくないということですね｡
‫何百万件､ 何千万件と登録される可能性があります｡
‫また､ 繰り返し実行するために全体を読み込む必要はなく､ 現在のプロセス､
‫つまり何を実行するかに応じて必要な分だけ読み込むようにしたいものです｡
‫それから､ AI列挙型インターフェースを使わない方がいいのはどんな場合でしょうか？
‫まあ､ すぐに結果が必要で､ 後でオブジェクトを変異させたり編集したりする可能性がある場合は､ そうなりますね｡
‫この場合､ 配列やリストを使用するのがよいでしょう｡
‫そのため､ 後でオブジェクトを変異させたり編集したりすることができ､ 結果をすぐに必要としない場合は､
‫配列やリストを使用します｡
‫そうでなければ､ AI列挙型を使うのが効率的だからです｡
‫わかりました｡
‫というわけで､ 今回の動画はここまでです｡
‫次回作でお会いしましょう｡