‫お帰りなさい｡
‫このビデオでは､ プロパティとセッターとゲッターについて､ 続けて説明します｡
‫前回のビデオでセッターとゲッターについて説明しましたが､ 今回は同じコードを使って少し拡張してみましょう｡
‫つまり､ メンバ変数の値を設定するためにセッタを使用することができ､ どのように設定したいかを独自のロジックで実装できることを確認しました｡
‫だから､ もしあなたが値を設定したいのなら､ 私のルールに従わなければならないので､ 独自のルールを定義することができます､
‫と言えるのです｡
‫フォローされています｡
‫そして､ ゲッターも調整することができます｡
‫だから､ この場合､ 長さ､ 高さ､ 幅の掛け算の結果を変数として与えれば､
‫自分の好きなように修正できるので､ よしとすればいい｡
‫それでは､ プロパティとその関連性を見てみましょう｡
‫そこで､ プロパティを作成して､ heightというパブリックプロパティを作成します｡ このheightは､ 私のheightメンバ変数を調整します｡
‫以前は公開されていたんですね｡
‫今度は､ 外から高さにアクセスできないように､ 非公開にします｡
‫ですから､ ここでは､ 高さ調整をしようと思っても､ もうできなくなります｡
‫今､ このエラーが出ました｡
‫いいかい？
‫ここで､ heightプロパティを使って､ 上の高さにアクセスできるようにしましょう｡
‫では､ どうすればいいのか｡
‫さて､ 私たちは､ まず､ このプロパティを最初に大文字のHで使います｡
‫プロパティの使い方は､ 一般的にそうなっていますね｡
‫それは､ 規約とC言語プログラミングです｡
‫プロパティは大文字から始まります｡ ここでゲッターを作成して高さを返し､
‫セッターを作成することができます｡
‫そして､ この高さを､ 例えば､ 割り当てられた値に設定すればいいのです｡
‫さて､ この価値観のキーワードは何でしょうか｡
‫さて､ ここでやっていることは基本的に前と同じで､ 長さを設定し､ 長さを取得することです｡
‫しかし､ 今は､ いわば私たちの玄関口が敷地の高さになっているのです｡
‫そのため､ 高さを記憶するためのアクセスや変更を行いたい場合は､ heightというプロパティを介して行う必要があります｡
‫そこで､ 今できることは､ 設定した値が高さに設定されることです｡
‫では､ 実際にこのプログラムで高さを設定しようとすると､ どのように見えるでしょうか｡
‫メンバ変数に直接アクセスすることで､ それができなくなる｡
‫しかし､ プロパティにアクセスすると､ ご覧のように､ 高さがここで利用できるようになっており､ このツールアイコンが見えるようになっています｡
‫これは一般的に､ プロパティにアクセスするときに持つアイコンで､ これが機能しているのがわかると思います｡
‫そうすると､ この等号の後ろ､ あるいは等号の後にあるものが､ ここにある値､
‫この値になり､ それが高さとして設定されることになるのです｡
‫つまりこの値は､ 以前このセットの長さを作成したときの長さとほとんど同じものです｡
‫コンセプトは同じですが､ より短い時間でできるようになったということですね｡
‫ここで､ もしセッターを持ちたいのであれば､ このようなコードがあることがわかります｡
‫もちろん､ ここではこのコードは必要なかった｡
‫いいかい？
‫それにしても､ これだけのコードがあったのに､ この超短いコードになったんですね｡
‫これがセッターなんですね｡
‫もちろん､ ここで調整することも可能です｡
‫ここで､ valueが0より小さい場合､ heightにマイナスvalueを設定し､ そうでない場合､ heightに等しいvalueを設定するとします｡
‫では､ プログラムで高さをマイナス4にしてみましょう｡
‫そして､ 以前､ このエラーを作ったからということを長々と言った｡
‫そうですね｡
‫そして､ 高さをマイナス4に設定し､ コードを実行してみましょう｡
‫そして､ その効果を確認する｡
‫だから､ 長さは高さに対して､ 幅は5です｡
‫では､ それはなぜなのか｡
‫マイナス4としたのにもかかわらず？
‫まあ､ 渡してきた高さの値がマイナスなら､ 掛け算にしようって話なんですけどね｡
‫だから､ 値が0より小さければ､ マイナス1を掛けることにしている｡
‫だから､ またポジティブにするんです｡
‫そして､ それがプラスであれば､ 作ったり､ 値を割り当てたりすればいいのです｡
‫あるいは､ ゼロであっても､ それはそれでいいんです｡
‫わかりました｡
‫それが､ プロパティでできることなんですね｡
‫さて､ これはプロパティの実装である｡
‫もちろん､ メンバ変数を持たずにプロパティだけを使うことも可能です｡
‫つまり､ このメンバー変数は､ 何も必要とされないものである可能性があります｡
‫だから､ それを省略することもできるんです｡
‫そこで､ 幅をメンバ変数として設定するのではなく､ プロパティとして持たせるとします｡
‫そして今度は､ プロパティを作成する別の方法を紹介します｡
‫そして､ この方がずっと､ ずっと速いんです｡
‫P､ R､ o､ pを使い､ ダブルタップすると､ このプロパティが作成されるわけです｡
‫あとは型を入力すればOKなので､ 「よし､ 整数にしよう｡
‫そして､ もう一度タブを押すと､ 今度は名前をつけることができます｡
‫だから､ これは幅寄せと言うんです｡
‫さて､ ここで何が起こっているのでしょうか？
‫これは､ Cシャープで理解できるコードで､ IDまで自動的に作成されています｡
‫そうですね｡
‫get semicolon set semicolonと書いてあるだけです｡
‫これは単に､ デフォルトのゲッターとデフォルトのセッターになることを意味します｡ つまり､ widthにアクセスしたい場合は､
‫このプロパティでwidth変数を使用してアクセスすればよいということです｡
‫また､ セットする場合は､ そのまま使用することも可能です｡
‫では､ 私たちの場合はどうなのでしょうか｡
‫さて､ これで値を代入するだけで､ このプロパティにアクセスできるようになったということです｡
‫そして､ 書き出すなら
‫そのため､ アクセスする場合は､ ボックス・ドットでボックスを使用します｡
‫とともに｡
‫そこで､ ここではプロパティに直接アクセスできるようにしました｡
‫わかりました｡
‫ここが違うんですね｡
‫つまり､ 内部的には作ったと同じことなんです｡
‫その
‫とともに｡
‫もう一度､ このメンバー変数を持ってこれに戻ろう｡
‫内部的には､ このpublic end withを作ったのと同じことで､ とりあえずこれをコメントアウトして､
‫ゲッターで幅を返すようにしています｡
‫とのこのドットも｡
‫そして､ バリューで始めると言ったセッター｡
‫わかりました｡
‫だから､ これは本当に｡
‫これです｡
‫ここのコードは､ 本当にこれと同じものです｡
‫また､ 内部的には､ コンパイルしたらどうなるかということでもあります｡
‫だから､ コンパイラは自動的にそれを行う｡
‫私たちは､ このコード行があれば､ 内部的にはここにあるコードと同じように扱いますが､
‫このコード行はもっと短く､ もっと簡単に作成できますよ､ というだけのことです｡
‫わかりました｡
‫そこで､ 私はこの短いアプローチがとても気に入っているので､
‫このようにコメントアウトしてみます｡
‫そして､ このメンバー変数ももう必要ない｡
‫わかりました｡
‫というのも､ ここでは幅を設定するので変数を覚えておく必要があり､ メンバー変数widthを設定しました｡
‫を設定しなかった｡
‫幅そのものを設定することができません｡
‫だから､ もし私が代わりにここでと書くだろう｡
‫そして､ もし私が今そうすれば､ 私はStackOverflowとして何を作成するのでしょう｡
‫だから常に何かを設定しようとすると､ ここで無限ループになってしまうので､ よくないんです｡
‫そのため､ この例ではここで変数を覚えておく必要があったのです｡
‫わかりました｡
‫しかし､ 内部的には､ こうだ､ ああだと扱われることになるのです｡
‫つまり､ 内部的にはここにあるようなコードと同じように扱われているのです｡
‫ただ､ 私たちにとっては､ もっと短い時間なんですけどね｡
‫わかりました｡
‫そこで､ 今度はちょっとしたチャレンジです｡
‫先に､ この幅のように､ それを囲むボリュームのプロパティを作成してください｡
‫わかりました｡
‫つまり､ ここでの例とほぼ同じですが､ 幅ではなく音量を調整することになります｡
‫だから､ ぜひ試してみてください｡
‫自分の財産を作る､ 打ち出す｡
‫ショートアプローチをしない､ またはショートアプローチを使用する｡
‫わかりました｡
‫そのため､ まずボリュームをプライベートにして､ ボリュームのプロパティを作成する必要があります｡
‫だから､ 大文字のVで始まるpublic int volumeはgetされることになる｡
‫ボリュームを戻してからセット
‫このスタートボリュームは､ イコールです｡
‫値です｡
‫ということで､ これがボリューム用に作成したプロパティです｡
‫できたのでしょうか｡
‫もちろん､ このボリュームを完全に取り除いて､ 幅と同じように作成することも可能です｡
‫もっと手っ取り早いんですが､ これだけカッコいいんだよっていうのを見せたくて｡
‫さて､ その
‫ここで重要なのは､ 体積変数やこの特性について､ なぜ､ どの時点でそれを変えたり､ 得たりすることに意味があるのか､
‫ということを考えることができることです｡
‫両方やることに意味はあるのでしょうか？
‫なぜなら､ 体積は幅と高さと長さをもとに計算されるものだからです｡
‫さて､ ボリュームを直接設定することに意味はあるのでしょうか？
‫いやいや､ そう言いたいですね｡
‫音量の設定も全く意味がないので､ このセッターを全部廃止してゲッターだけにすればいいと思います｡
‫さて､ 音量そのものですが､ 私たちは音量を設定することはありません｡
‫常に計算されているのです｡
‫では､ ボリュームを返すだけでは意味がないのでしょうか？
‫というのも､ 実はこの時点で､ 体積は長さ､ 高さ､ 幅の掛け算になることを計算しなければならないのです､
‫わかりますよね｡
‫だから､ 今はもっともっと意味があるんです｡
‫だから､ ボリュームで返すものは､ もっともっと意味があるんです｡
‫ボリュームを求める人がいれば､ それはそれでいいと思います｡
‫さて､ もちろん､ 私たちはこの一番下に小さなバグを作ったり､ もう必要のないボリュームを取得するメソッドを作ったりしました｡
‫そして､ 同時にここは､ 今の幅は私たちがアクセスする敷地です｡
‫になるわけではありません｡
‫もう､ バリアブルを覚えていないのですから｡
‫もちろん､ プログラムCSSで､ すべてを調整することもできるようになりました｡
‫これで､ 幅に直接アクセスできるようになり､ ボリュームプロパティにも直接アクセスできるようになり､ ボリュームメンバ変数も不要になりました｡
‫わかりました｡
‫では､ ここで最後の仕上げをしましょう｡
‫そしてそれは､ コンストラクタを追加することです｡
‫だから公開｡
‫ボックスです｡
‫INTの長さ｡
‫INT.
‫高さと端｡
‫幅です｡
‫そこで､ 今､ ボックスを作成すると､ これらの値をすべて持ち､ ボックスを作成した後に与えられる長さは､
‫このドットの長さにする必要があります｡
‫そうすると､ 与えられた高さ､ このドットの高さが高さとなるはずです｡
‫ですから､ ここに与えられた高さは､ 私たちのメンバー変数である高さになるはずです｡
‫そして､ 私たちの幅は最終的なもので､ これはプロパティです｡
‫そこで､ 与えられた幅に設定するのです｡
‫さて､ この場合､ もちろんこの､ このキーワードを省略することもできます｡
‫このクラスのプロパティについて話していることも明らかなので､ widthと言えばいいのです｡
‫だから､ ここにこのキーワードは必要ないんです｡
‫さて､ どなたかの質問で重要なことがありましたので､ 本当にはっきりさせておきたいと思います｡
‫だから､ このドットの長さ､ 等しい長さは機能しますが､ 長さがこのドットの長さと等しいのは意味をなしません｡
‫つまり､ この行は意味をなしません｡ なぜなら､ lengthはこの部分であり､ 実際には単なるパラメータであり､ 私たちに与えられる値なのですから｡
‫つまり､ 与えられた値を調整するのではなく､ プロパティやメンバ変数の値を設定したいわけです｡
‫だから今回は､ そういうことです｡
‫メンバー変数の値を設定しました｡
‫よし､ ではこのボックスを使ってみよう｡
‫今､ 箱を作ろう｡ 今はもう､ そういうことを全部やる必要はないのだから｡
‫もう直接値を設定する必要はありませんが､ ボックスを作成する際に設定することができます｡
‫だから､ 値3､ 4､ 5を割り当てるだけだ｡
‫だから､ 長さは3本です｡
‫高さは4で､ 幅は5です｡
‫そして､ これを実行すると､ 幅と体積が表示されるようになります｡
‫これでいいんですね｡
‫5巻は60枚｡
‫わかりました｡
‫それが効果的なようです｡
‫さて､ ここでできることは､ プロパティにアクセスすることで幅を設定することです｡
‫今､ 幅を10に設定して､ もう一度このコードを実行するとしよう｡
‫そして､ もう一度スプリットで､ 与えられたデフォルトの値が印刷され､ 次に設定した新しい値が印刷されていることがわかります｡
‫そこで､ widthを10に設定すると､ 今度はwidthと表示され､ それに応じて幅が計算されるようになりました｡
‫つまり､ 3回､ 4回10回で20回に1回ということです｡
‫新巻です｡
‫わかりました｡
‫召喚すること｡
‫そこで､ まずメンバー変数を大量に作成しました｡
‫このクラス自身以外が直接アクセスできないように､ プライベートにしています｡
‫そのため､ 他のクラスはそれらに直接アクセスすることはできません｡
‫この場合､ 私たちが作成したプロパティ､ またはセッターやゲッターを介してのみアクセスすることができます｡
‫そこで､ 長さを得るセット長を用意しました｡
‫したがって､ もし誰かがlength変数にアクセスしたいのであれば､ set lengthとget lengthを使うしかない｡
‫これは全く有効なアプローチであり､ そのことがおわかりいただけると思います｡
‫そうそう､ そういうアプローチだと､ 従わせたいロジックを定義できるんですよね｡
‫誰かが､ 例えば､ 変数を設定したり､ 変数を取得したりしたい場合｡
‫さて､ もう一つの方法は､ プロパティを直接使用することです｡
‫つまり､ プロパティを使う場合は､ 大文字で呼んで､ ゲッターなどを実装する必要があるわけです｡
‫が､ ゲッターだけを実装するか､ セッターだけを実装するかを決めればいいのです｡
‫もちろん､ ここでその両方を実装しているわけではありません｡
‫を設定することもできます｡
‫値を直接指定するので､ メンバ変数を設定することもできます｡
‫によって､ ここでやったことです｡
‫いわば､ Heightというゲートウェイを追加することです｡ これは､ ここで一番上に作成したheightというメンバー変数に､ 私たちのプロパティを追加することです｡
‫あるいは､ 直接的に､ 非常にシンプルな自動実装のプロパティを用意し､
‫そのために追加のメンバ変数を用意する必要はない､ としました｡
‫それらの変数がすべてプロパティだけを持つようにしてもよかったのです｡
‫だから､ とてもシンプルにできたんです｡
‫でも､ こんな3つのプロパティがあるだけで
‫これです｡
‫そのため､ これらすべてを取り除き､ publicまたはapr0pをダブルタップすると､
‫長さが設定され､ 高さも同じように設定されます｡
‫ただ､ いろいろな方法があることを､ すべてお見せしたかっただけなのです｡
‫そして､ 何かを見るとき､ あるいはプロパティを使うとき､ たいていはこのような形で見ることになります｡
‫では､ もうひとつの実装物件では､ 何が一番簡単で早い方法なのでしょうか？
‫今回ご紹介したようなさまざまなアプローチをすべて使う必要はありません｡ それが本当に重要なのです｡
‫さまざまな構造体をすべて使用する必要はありませんが､ 場合によってはセッターを実装する必要があります｡
‫場合によっては､ 特定のゲッターを実装する必要がありますが､ その方法がわかりましたね｡
‫要するに､ 疑問があるとすれば､ なぜこの方法が必要なのか？
‫まあ､ プロパティーアセッサーで追加のロジックが必要ない場合に使われるだけなんですけどね｡
‫だから､ プロパティの定義で､ ええ｡
‫ゲッターとセッター｡