‫お帰りなさい｡
‫このビデオでは､ 抽象クラスを取り上げ､ そのため､ 新しいクラスをたくさん作成します｡
‫そして､ クラスの概念を理解し､ さらに継承とポリモーフィズムを理解することが重要です｡ なぜなら､ 私たちはそれを基礎にしていくからです｡
‫そして､ まず始めるのは､ 新しいクラスを作ることです｡
‫では､ 新しいクラスを作りましょう｡
‫ここで､ Project Add classに移動して､ Shapeクラスを作成し､ それをShape CSSとします｡
‫さて､ このアイデアは､ オブジェクトを作成しないクラスを作りたいので､ shapeのインスタンスを作成したくないということです｡
‫形状のタイプであるオブジェクトをインスタンス化したいのですが､ 形状そのものではありません｡
‫つまり､ 例えば､ 形は立方体であったり､ 球体であったりするわけです｡
‫そして､ ここでは3D形状を使用していますね｡
‫立体的な形｡
‫shapeを継承するクラスを作りますが､ shapeは実際の抽象クラスであることを確認してください｡
‫つまり､ そのオブジェクトを作ることはできませんが､ そのシステム､ メソッド､
‫プロパティを使うことになります｡
‫では､ さっそく始めましょう｡
‫この形をまず､ 抽象的にしてみましょう｡
‫そして､ そのためには､ abstractというキーワードを使えばよい｡
‫つまり､ 今は抽象的なクラスなんですね｡
‫では､ このプログラムを見て､ それが実際の抽象クラスであることを確認してみましょう｡
‫では､ シェイプを作成してみましょう｡
‫シェイプ1は新しいシェイプに等しい｡
‫そこで､ これを実行しようとすると､ 抽象クラスやインターフェース形状のインスタンスを作成することができないことがわかります｡
‫また､ Shapeは抽象クラスなので､ そのオブジェクトを作ることができず､ インスタンス化することができません｡
‫ここは重要なポイントです｡
‫わかりました｡
‫ここで､ プロパティが必要になるので､ nameというプロパティを作成します｡
‫だから､ シェイプには名前が必要で､ ゲッターなどを用意しています｡ これを作成するために､ 私はpre propを使い､ ダブルタブで新しいプロパティを作成しています｡
‫だから､ 他の動画でも見たことがあるんです｡
‫今度はメソッドを持ちたいのですが､ そのメソッドは仮想メソッドになります｡
‫仮想空洞の情報を取得します｡
‫この仮想キーボードは､ ベースクラスで宣言されたメソッド・プロパティ・インデクサやイベントを変更し､
‫派生クラスでの上書きを可能にするために使用されるものです｡
‫つまり､ これによってドライビングクラスでget infoメソッドをオーバーライドすることができます｡
‫わかりました｡
‫それが､ ここにある仮想キーワードの考え方です｡
‫では､ ここで一文追加しておきましょう｡
‫そのため､ 正しい行を制御するために､ ダブルタブを参照してください｡
‫とか､ ここでは､ こんなことを書きたいだけです｡
‫これはaで､ 次に形状の名前です｡
‫これは名前なんですね｡
‫そして､ この背後にあるアイデアは､ 新しい行を作成し､ このステートメントを作成することです｡
‫これはaで､ 次にシェイプの名前です｡ シェイプを作成するたびに､ その名前を設定することができるからです｡
‫つまり､ 仮想空洞があるわけです｡
‫さて､ 今度は抽象的なメソッドを追加することもできます｡
‫では､ その抽象的なダブルボリュームをやってみましょう｡
‫そこで計算したいのは､ 図形の体積です｡
‫さて､ ここでは､ この方法は実装しないことにします｡
‫ここが重要な違いです｡
‫ここで実装するつもりはない｡
‫よし､ 俺から継承したいクラスはいつでもボリュームメソッドの機能を実装する必要があるんだ､
‫と｡
‫わかりました｡
‫さて､ もちろん､ これをボリュームと呼んで計算したりすることもできますが､ ここでは､ ボリュームと呼ぶことにします｡
‫わかりました｡
‫さて､ Shapeクラスの準備ができたので､ それを保存して､ 新しいクラスを作成します｡
‫ということで､ 次に作るクラスはキューブクラスです｡
‫そこで､ 3D形状であるCubeを作成することにします｡
‫これで､ 私のキューブはshapeを継承することになります｡
‫そうすると､ ここでエラーが発生することがおわかりいただけると思います｡
‫Cube は､ 継承された抽象メンバ形状ボリュームを実装していないと表示されます｡
‫だから､ ショーポテンシャルはこれを修正します｡
‫よし､ 抽象クラスを実装しよう｡
‫そうすると､ このボリュームメソッドをオーバーライド文で実装していることがわかります｡
‫つまり､ shapeで定義されたものを上書きしていると言うことです｡
‫そして､ Shapeは抽象クラスであり､ このメソッドも抽象的なものである｡
‫見ての通り､ メソッド本体がありません｡
‫本当にメソッドの宣言だけなんです｡
‫だから今は､ もちろん何かを実装して行くことができます｡
‫ここでは､ 実装された例外ではなく､ エラーを投げているのがわかると思います｡
‫もちろん､ ここに何かを実装したい｡
‫そこで､ キューブクラスで体積計算を実装してみましょう｡
‫さて､ これを計算するために必要なのは､ 長さを表すプロパティが必要です｡
‫ここでは､ lengthという新しいプロパティを作成し､ コンストラクタを追加します｡
‫だからPublic Cubeで､ キューブを作りたいときは必ず長さを渡す必要があるんだ｡
‫だから､ 私はここで言い続けているのです｡
‫ついでに名前も追加で｡
‫このように､ nameはcubeでは定義されていませんが､ shapeでは定義されているため､ ここでは継承を使用しています｡
‫だから､ ここに変数名を設定すればいいし､ 長さも渡された長さを設定すればいいんだ｡
‫そのため､ プロパティの長さは､ 一旦型のオブジェクトを作成した後に渡される長さと同じになる｡
‫Q それがこの変数の考え方なんですね｡
‫そして次に､ このボリューム・メソッドを実装して､ 単純に何かを返すことができます｡
‫つまり､ doubleを返す必要があるのですね？
‫そこで､ doubleを基準としたものを返す必要があります｡
‫そして､ 立方体の体積を計算するために､ すべての辺の長さが同じである立方体をここに使用します｡
‫だから､ 長さは3の累乗でいいんです｡
‫数学､ パルプ､ 長さ3ということは､ 長さ､ 長さの倍､ 長さの倍を計算することになるわけです｡
‫つまり､ これがボリュームとなり､ この値が返されます｡
‫次に､ get infoというメソッドを実装します｡
‫これから行うのは､ これをコピーして､ virtualキーワードを使わずにoverrideキーワードを使うことです｡
‫なぜなら､ 親のget infoメソッドをここでオーバーライドしたいからです｡
‫そうすると､ ベースクラスからget infoメソッドを呼び出すこともできます｡ つまり､ この場合はshape dot
‫CSSからget infoを呼び出すということです｡
‫そこで､ このメソッドを呼び出すことになります｡
‫つまり､ このコードが実行され､ その下に追加されたコードが実行されるということです｡
‫ここに小さなテキストを追加して､ 立方体の長さを示すことにします｡ そして､ 長さをここに渡します｡
‫だから長さ､ もちろんここで体積を計算することもできるのですが､ それはお任せします｡
‫だから､ やりたい人は自由にやってください｡
‫わかりました｡
‫だから､ こうしてできるのです｡
‫抽象的な他のクラスを継承するクラスを作成します｡
‫では､ ちょっとしたチャレンジとして､ 一度ビデオを一時停止して､ チャレンジから始めてみてください｡
‫そこで､ shapeを継承した別のクラスであるshapeを作成し､ そのshapeを球形にすることを考えます｡
‫ここで､ Sphereに見られるのと同じような機能を実装してください｡
‫わかりました｡
‫頑張ってください｡
‫ビデオを投稿して､ それをやってみてください｡
‫わかりました｡
‫だから､ 試してみてほしいですね｡
‫ここに新しいクラスを作成し､ このクラスを sphere dot CSS と呼ぶことにします｡
‫そして､ このクラスはshapeを継承しているはずです｡
‫そしてもちろん､ 私の抽象的なクラスを実装する必要があります｡ つまり､ このボリュームメソッドを実装する必要があるのです｡
‫しかし､ 今回は長さではなく､ 半径を計算する必要があります｡ なぜなら､
‫球体と立方体では体積の計算方法が異なるからです｡
‫そして､ シェイプでやらなかったのは､ シェイプ単体では体積を持つことができないからですよね？
‫Yと定義されていなければ､ 例えばどんな形なのかがわからないので､ 体積を計算することができません｡
‫そうですね｡
‫そのため､ shapeを継承し､ その機能を実装したクラスが必要になります｡
‫では､ 次にコンストラクタを作成し､ public sphere､ double radiusを作成します｡
‫そこで､ 半径が必要です｡ 次に､ 球体の名前を設定します（sphere）｡
‫そこで､ 渡された半径をプロパティのradiusの値として代入します｡
‫さて､ これで体積を計算できるようになりました｡
‫そこで今度は､ ここで例外を投げるのではなく､ 球体の体積を計算したいと思います｡
‫そして､ そのためにはPIが必要で､ 次のような計算が必要です｡
‫だから､ そのパルラジアスの3乗と､ 3÷ああ4÷3を全部掛け合わせた算数｡
‫わかりました｡
‫このようにして体積を計算し､ 次に情報取得メソッドを実装します｡
‫だから､ 私は自分のキューブから情報を取得するためにコピーするつもりです｡
‫ダラダラしてしまう｡
‫だから､ ここの部分をコピーして､ 同じように実装してください｡
‫そこで､ 再びoverrideキーワードを使用し､ shapeクラスの時と全く同じ名前にします｡
‫そして､ この中のメソッドを呼び出すために､ ここでベースコード情報を使っています｡
‫そこで､ メソッド本体が何であれ､ 長さを渡したり､ 長さについて何かを言う代わりに､
‫半径と立方体について何かを言おうとしているのです｡
‫この場合､ 球の半径がradiusであることです｡
‫わかりました｡
‫さて､ これですべて揃ったわけですが､ 次にできることは､ これらの異なるクラスのオブジェクトをすべて作成することです｡
‫だから､ ここでハローワールドと言うつもりはない｡
‫その代わり､ シェイプをたくさん作るんだ｡
‫だから､ よし､ 形状の配列をくださいということになるんです｡
‫そして､ 半径4の新しい球体と､ 半径3の新しい立方体になるのです｡
‫この場合､ キューブには半径がなく､ 長さがあるため､ 実際には3の長さです｡
‫そして､ それぞれの図形に対して何かを実行したいのです｡
‫だから､ シェイプインシェイプのために､ 私はしたいのです｡
‫この場合､ 2人だけで全部通してください｡
‫でも､ 私が欲しいのは情報を形にすることです｡
‫だからget infoは呼び出すべきで､ こんな風に書きたいのです｡
‫そして､ 今回はゼロ｡
‫が名前になり､ その後にボリュームを表示させたい｡
‫だから､ 名前にボリュームがあるようにしたい｡
‫それから､ 当然ながら､ この作品のボリュームも知りたい｡
‫だから､ 名前をカタチにして､ ボリュームをカタチにする｡
‫ここでは､ ボリュームメソッドを呼び出すことが重要なんですね｡
‫だけではありません｡
‫物件です｡
‫つまり､ コンソールの赤い線は､ この場合､ 名前の体積の体積を持っているのです｡
‫だから､ 体積を計算するだけです｡
‫さて､ それでは実際にテストしてみましょう｡
‫ここで何が起こっているのか､ 何を作ったのか､ そして私たちがそうであることを確認しましょう､ ここには空の､ 空の行があります｡
‫すると､ これは球体ですと言うのです｡
‫球体の半径は4です｡
‫球体の体積は268です｡ 08.
‫そして､ これは立方体です｡
‫この立方体は､ 長さが3である｡
‫この立方体の体積は27です｡
‫わかりました｡
‫このように､ ここで書いたコードは非常にシンプルなものですが､ 抽象クラスについて知っておくべき機能のほとんどをすでに説明､
‫または示していることがおわかりいただけると思います｡
‫さて､ まだ使っていないキーワードをさらに使うことができます｡
‫そして､ このビデオも長くなってきたので､ 次のビデオでそれを行うということです｡
‫それでは､ 会場でお会いしましょう｡