カテゴリー
Python

クラスの継承について知ろう1

この章ではクラスの継承について説明します。
親クラスの機能を引き継ぐクラスであるサブクラスを作成することを継承といいます。
親クラス(スーパークラスとも言います)とは元のクラスのことで、以下の例ではBankクラスがこれに該当します。
サブクラス(子クラスとも言います)とは親クラスの機能を引き継いだクラスです。
以下の例ではShoukenクラスがこれに該当します。
子クラスは親クラスのメソッドや変数を全て使うことができますので、子クラスでは親クラスのメソッドや変数をあえて書く必要はありません。
子クラスではゼロから親クラスにあるメソッドや変数を作らなくていいので、プログラムがすっきりします。
BankはShoukenを内包しているので継承関係が成り立つわけで、まったく関係ないクラス同士を継承させても意味はありません。
例えばCarクラスとBankクラスは全く機能が違うので、継承関係にしても意味がありません。
では例をみてみましょう。9999999 結果は次の通りです。9 クラスの継承は以下の構文で書きます。9 例では9の箇所です。
以下の通り、子クラスのメソッド内では親クラスの変数を使うことが出来ますが、形式は9です。9 子クラスは親クラスのメソッドや変数を全て使うことができますので、以下の通り子クラスのオブジェクトから親クラスのメソッドを使うことができます。9
次にオーバーライドについて説明します。
子クラスでは親クラスのメソッドと同じ名前で内容だけ違うメソッドを作成することが出来ます。
これをオーバーライドと言います。
メソッド名は変えずに、子クラス独自の内容に変えることが出来ます。99999

カテゴリー
Java

クラスの継承について知ろう

この章ではクラスの継承について説明します。
クラスの継承とは親クラスの他に、もう1つの関連したクラスを作ろうとした時に親クラスのフィールド変数やメソッドを引き継ぐことを言います。
親クラスとは継承の基本となるクラスで、このクラスを基本に他のクラスが親クラスのフィールド変数などを使うことになります。
もう1つの関連したクラスのことを子クラスもしくはサブクラスと言います。
親クラスと同じフィールド変数やメソッドを子クラスで使わなくてはいけない時、同じフィールド変数やメソッドを子クラスで再度記述する必要はありません。
また、子クラスでは独自のフィールド変数やメソッドを追加することもできます。
このように親クラスに使いたいメソッドとフィールド変数があって、さらに子クラスに新たなメソッドやフィールド変数を加えたい時にクラスの継承を使います。
継承の構文は以下の通りです。1 では例を見てみましょう。
次の例は親クラスの「Banksystem.java」です。111111 次の例は「Securities.java」です。11111 結果は以下の通りです。1 ではクラスの継承について説明します。
この例の継承は以下の箇所です。スペースの都合で2行で書いていますが、通常は1行で書きます。1 親クラスがBanksystemクラスで、子クラスがSecuritiesクラスです。
子クラスは親クラスのフィールド変数やメソッドを継承できるので親クラスのメソッドや変数を以下のように使うことができます。1 子クラスのSecuritiesクラスのオブジェクトを作成しているのにも関わらず、setNameメソッドなど親クラスのメソッドを使うことが出来ているのが分かります。
子クラスでは親クラスのフィールド変数やメソッドを使うだけではなく、子クラス独自のフィールド変数やメソッドも作成することが出来ます。
それがcompany変数、companyBanknameメソッド、stockbuyメソッド、stocksellメソッドです。
Securitiesクラスのmainメソッドで以下の通り、子クラスのメソッドとプロパティを実行しています。1

次にオーバーライドについて説明します。
子クラスで改めて親クラスのメソッドやフィールドを書く必要はありませんが、この例では1つだけ親クラスと共通のメソッドを子クラスで書いています。
それはresultメソッドです。11 このように子クラスと親クラスで同じ名前のメソッドを作ることが出来て、子クラスのメソッドでは内容だけ親クラスと違う内容で書くことができます。
これをオーバーライドと言います。
この例では親クラスのresultメソッドの中の1を子クラスのresultメソッドで1に変更しました。
では次に進みます。
親クラスでprivateが付いているフィールド変数やメソッドは子クラスでは使用することはできません。
この例の親クラスのフィールド変数のアクセスレベルにはprotectedが付いていますが、このアクセスレベルをprivateに書き換えると以下の通りになります。1 このようにprivate指定したフィールド変数は次のように子クラスから親クラスのフィールド変数にアクセスすることはできません。1 ですので、この例では以下のようにprotectedを付けて、子クラスでも使えるようにしています。
protectedは子クラスから親クラスのフィールド変数やメソッドにアクセスできることを意味します。1 [補足]
フィールド変数に直接、値を入れるのではなく、メソッドで値をチェックしてから値を入れるのもいいでしょう。
例では以下のようなメソッドでフィールド変数に値を入れています。
ここでは名前に何も入力していない場合は「カラ」と、出力するようになっています。1 また、以下のgetNameメソッドはsetNameメソッドで得たmynameの値を返すためのメソッドです。1 setNameメソッドは値をセットするためのメソッドで、getNameメソッドは値を返すためのメソッドです。
このようにフィールド変数に値をセットしたり、値を返したりするには「値をセットするためのメソッド」「値を返すためのメソッド」と別ける場合が多いです。
値をセットするためのメソッド名は先頭にsetを付け、値を返すためのメソッドは先頭にgetを付けるのが慣習になっています。

もう1つ継承の例を見てみましょう。
次の例は親クラスの「Vehicle.java」です。111 次は継承クラスの「Used.java」です。1111 結果は以下の通りです。1 この例では以下のようにVehicleクラスを継承したusedクラスを作成しています。
class Used extends Car{
}

次に継承におけるコンストラクタの動きについて説明します。1 =>子クラスであるUsedクラスのオブジェクトが作られた時にはまず初めに自動的に親クラスの引数の無いコンストラクタが呼ばれます。
その後に子クラスのコンストラクタが呼ばれることになります。
つまり親クラスに引数のあるコンストラクタだけで、引数の無いコンストラクタが無い場合はエラーになります。
この例では以下の通り、引数の無いコンストラクタも引数のあるコンストラクタも両方書いてあるので問題ありません。1 自動的に親クラスの引数の無いコンストラクタが呼ばれると書きましたが、では親クラスに引数の無いコンストラクタが無い場合にエラーになるのだとしたら、どう対処したらいいでしょうか?
方法は2つありますが、一つ目の方法は先ほど説明した通り、親クラスに引数の無いコンストラクタを作る方法です。
二つ目の方法は子クラスのコンストラクタの中で1を使う方法です。
では例をみてみましょう。
次の例は親クラスの「Vehicle.java」です。11
次の例は子クラスの「Used.java」です。1111 以下の箇所がsuperを使用した箇所です。1 superとは親クラスのことであり、子クラスのインスタンスメソッドやコンストラクタの中で親クラスのフィールド変数、メソッド、コンストラクタに接続することが出来ます。
この例は子クラスのコンストラクタの中で親クラスのコンストラクタを呼び出しています。
super()を使って親クラスのコンストラクタを呼び出す時には、子クラスのコンストラクタの中の1行目に書いてください。1 次の図の通り、superは親クラスのコンストラクタを呼び出して親クラスのフィールド変数に値を代入しています。
「フェラーリ、10、5」は親クラスのフィールド変数に入り、「60000、あり」は子クラスのフィールド変数に入ります。
ですので、コンストラクタの数は5つ必要です。1 super()を使うことで親クラスに引数の無いコンストラクタを書く必要がなくなります。

カテゴリー
PHP

クラスの継承について知ろう

次はクラスの継承について説明します。
「クラスの継承」とは親クラス(元のクラス)の他に「もう1つの関連したクラス」を作ろうとした時に親クラス(元のクラス)のプロパティやメソッドを引き継ぐことを言います。
「もう1つの関連したクラス」のことを子クラスもしくはサブクラスといいます。
親クラスと同じプロパティやメソッドを子クラスで使わなくてはいけない時、同じプロパティやメソッドを子クラスで再度記述する必要はありません。
また、子クラスには子クラス独自のプロパティやメソッドも追加することもできます。
このように「親クラスに使いたいメソッドとプロパティがあって、さらに子クラスに新たなメソッドやプロパティを加えたい」時にクラスの継承を使います。
では例を見てみましょう。
下のファイルはLesson49.phpです。これが親クラスです。1111 Lesson49.phpのプロパティにはprotectedという修飾子が付いていますが、これは同じクラスか継承クラスからのみアクセスが可能と言う意味です。
仮にこの箇所をprivateに変更しますと子クラスでは使うことが出来ません。
ではLesson49.phpの中のBanksystemクラスをLesson50.phpの中のSecuritiesクラスで継承します。Securitiesの意味は証券という意味です。
設定は銀行口座から株式を買い付け、証券を買ったのなら、その代金を銀行口座から引いて、株式を売ったのならばその代金を銀行口座に入れると言うプログラムです。
以下の例はLesson50.phpです。11111 require_onceでLesson49.phpを読み込んでいますが、この記述がないとエラーになります。
では子クラスの作成方法について説明します。1 子クラス名と親クラス名の間にextendsを付けます。
注意してほしいことは全く違うクラス同士を継承してはいけないことです。
例えば銀行クラスと自動車クラスは関連のないクラスなので、継承関係を作っても意味ありません。
継承関係が正しいかどうか悩む場合には「子クラスは親クラスの子供である」という箇所の子クラス、親クラスに自身で作ったクラス名を当てはめてみて、違和感がないようでしたらそれは正しい継承関係です
「銀行クラスは自動車クラスの子供である」と聞いてもおかしいと思いませんか?違和感があるようでしたらそれは間違っています(もちろん、意味があれば問題ありません)。
「親クラスは以前違うプロジェクトで作ったけど、今回のプロジェクトで作るクラスと似ているので、親クラスを継承して、足らない部分だけメソッドやプロパティを新たに加えて子クラスを作ろう」という思想でクラスの継承を作る場合が多いです(継承を使えば初めから開発し直す手間が省けますので)。

次はプロパティ、メソッド、コンストラクタの継承について説明します。
1など Banksystemクラスのメソッドであるのに、Securitiesクラスで使用できていますが、これは親クラスのBanksystemクラスを継承しているからです。
この他の親クラスのプロパティやメソッドも同じように子クラスで使用することが出来ますが、親クラスのプロパティやメソッドでprivateで指定してあるものは使用することが出来ないので気を付けてください。
親クラスのプロパティやメソッドの他にコンストラクタも継承することが出来ます。
これは親クラスのプロパティを初期化したい場合にはコンストラクタを継承すると便利です。
親クラスのコンストラクタを子クラスで使いたい場合には1という記述が必要です。
「parent::」は親クラスを指しています。
以下のように子クラスのコンストラクタの中に親クラスのコンストラクタを書いてください。1次にオーバーライドとは何かについて説明します。
BanksystemクラスとSecuritiesクラスにresultという同じ名前のメソッドがありますが、このように親クラスと子クラスは同じ名前のメソッドを作ることが出来ます。
これをオーバーライドと言いまして、同じ名前のメソッドを作ることによって、親クラスのメソッドより子クラスのメソッドを優先して使うことが出来ます。
子クラスでは親クラスのメソッドと名前が同じでも新たなものを付け加えることができます。
例えばこの例では「株式売却後の」を子クラスのresultメソッドに加えました。1
次は子クラス独自のプロパティやメソッドについて説明します。
子クラスには子クラス独自のプロパティやメソッドを書くことが出来ます。
この例で言いますと$companyプロパティ、stockbuy メソッド、stocksellメソッドです。
では最後に出力までの流れを見てみましょう。1 =>この部分は継承したプロパティに以下のようにデータを代入しています。
1継承したdepositメソッドに10000000を渡します。1 子クラスの独自メソッドに購入金額と購入する株式名を渡します。
この時点で「河野自動車株を1000000円購入しました」が出力されます。1 最後にresultメソッドで出力します。1 結果は「株式売買後の山田銀行の近藤次郎様の残高は9150000」になります。