カテゴリー
Python

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

この章では親クラスの変数を子クラスで初期化する方法について説明します。99999999 子クラスの中で親クラスの変数と子クラスの変数を子クラスの中で初期化したい場合は以下のように書きます。9 9子クラスのinitメソッドの引数の内、a,c,fが親クラスのインスタンス変数の初期化に使われて、残りのeが子クラスのインスタンス変数company1の初期化に使われます。
ですので、オブジェクトの引数は4つになります。9 図にすると以下のようになります。9 結果は次の通りです。9

カテゴリー
Python

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

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

カテゴリー
Ruby

クラスの継承について説明します

この章ではクラスの継承について説明します。
クラスの継承とは元々あるクラスを拡張して、新しいクラスを作成することを言います。新しいクラスを作成するのに元のクラスと変数やメソッドが重なった場合, 元のクラスの機能を使える仕組みが継承です。
つまり、新しいクラスをゼロから作成するのではなく、元のクラスの機能を借りて新しいクラスを作成する仕組みが継承です。
元のクラスを親クラス(スーパークラスとも言います)、その親クラスを受け継いだクラスを子クラス(サブクラスとも言います)と言います。9 では少し長いですが例をみてみましょう。9999999 では説明を始めていきます。
この例では親クラスのBankクラスを受け継いだShoukenクラスを作成しています。
その子クラスの中には親クラスにはない子クラス独自のメソッドや変数を書きます。
なぜなら、子クラスは親クラスのメソッドや変数を全て使うことができるので、あえて親クラスのメソッドや変数を書く必要が無いからです。
ではどこで親クラスの変数を取得しているかと言いますと9です。
superとは親クラスを意味します。
子クラスの中でsuperはinitializeメソッドの中にありますが、この場合にはsuperは親クラスのinitializeメソッドを呼ぶことを意味します。
子クラスのメソッドの中でsuperを使うとそのメソッド名と同名のメソッドを親クラスから呼び出すことができます。
この例では子クラスのinitializeメソッドの中でsuperを使っているので親クラスのinitializeメソッドを呼び出すことができます。9 super(name,age,money)の箇所は以下の作業をしています。
オブジェクトの引数が親クラスのinitializeメソッドの中のインスタンス変数に代入されます。9 そして、initializeメソッドの引数aは@company1に代入されます。9 その他にもこの例では以下のように子クラスのresultメソッドからsuperを使って、親クラスのresultメソッドを呼び出しています。9 実はこのresultメソッドは親クラスにも子クラスにもありますが、このように子クラスの中で親クラスと同じ名前で中身だけが違うメソッドを作ることが出来ます。
これをオーバーライドと言います。
先ほども書きましたが、superの機能を詳しく言いますと子クラスの中のオーバーライドしているメソッドの中にsuperを記述すると親クラスの中の同名のメソッドを呼び出すことができます。
例えば上の例では子クラスのresultメソッドから親クラスのresultメソッドを呼び出しています。
では次の箇所の説明をします。9 複数の箇所で9を使っていますが、「+」は文字列同士を連結する機能がありますので、オブジェクトが数値の場合には9を使用して、文字列に変換してください。9 結果は以下の通りです。9

カテゴリー
Cシャープ

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

この章ではクラスの継承について説明します。
クラスの継承とは親クラス(元のクラス)の他に、もう1つの関連したクラスを作ろうとした時に、親クラスのフィールド変数やメソッドを引き継ぐことを言います。
もう1つの関連したクラスのことを子クラスもしくはサブクラスと言います。
親クラスと同じフィールド変数やメソッドを子クラスで定義しなくてはいけない時、同じフィールド変数やメソッドを子クラスで再度記述する必要はありません。
また、子クラスには独自のフィールド変数やメソッドも追加することもできます。
では例を見てみましょう。1111111111111Banksystemクラスが親クラスで、Securitiesクラスが子クラスになります。
SecuritiesクラスはBanksystemクラスを継承しているので、Banksystemクラスのフィールド変数やメソッドを使用することが出来ます。11子クラスの中で親クラスのフィールド変数を使うことができると言いましたが、それが以下の箇所です。他にもstockbuyメソッドやstocksellメソッドの中でも使われています。1また、子クラス独自のフィールド変数やメソッドを書くことができると言いましたが、それがcompany変数やstockbuyメソッドやstocksellメソッドやresultメソッドです。
改めて親クラスのメソッドやフィールドを子クラスで書く必要はありませんが、この例では1つだけ親クラスと共通のメソッドを書いています。それはresultメソッドです。11このように子クラスと親クラスで名前が同じで、内容だけが違うメソッドを作ることが出来ます。
つまり、メソッド名は変えずに、子クラス独自の内容に変えることが出来ます。
これをオーバーライドと言います。1次にprivate とprotectedについて説明します。
親クラスでprivateが付いているフィールド変数やメソッドは子クラスからはアクセスすることはできません。
例の親クラスのフィールド変数を以下のようにprivateに書き換えると子クラスのメソッドから使用することは出来なくなります。1ですので、この例では以下のようにprotectedを付けて、子クラスでも使えるようにしています。
protectedは子クラスから親クラスにアクセスできることを意味します。1結果は以下の通りです。1次は子クラスから親クラスのコンストラクタを呼び出す例です。11111111111結果は以下の通りです。1では子クラスから親クラスのコンストラクタを呼び出す方法について説明します。
Mainメソッド内で子クラスのオブジェクトを作成し、ここで親クラスや子クラスのフィールド変数にデータを入れています。1上のように子クラスであるUsedクラスのオブジェクトが作られた時にはまず初めに自動的に親クラスの引数の無いコンストラクタが呼ばれます。1つまり親クラスに引数のあるコンストラクタだけで、引数の無いコンストラクタが無い場合はエラーになります。
親クラスの引数の無いコンストラクタが呼ばれた後に子クラスのコンストラクタが呼ばれることになります。
この例の場合にはコンストラクタの中でさらにsetfieldメソッドを呼び出して値のチェックをしています。
このような書き方も出来ますので覚えておいてください。11自動的に親クラスの引数の無いコンストラクタが呼ばれると書きましたが、では親クラスに引数の無いコンストラクタが無い場合エラーになるのだとしたら、どう対処したらいいでしょうか?
方法は2つありますが、1つ目はこの例のように親クラスに引数の無いコンストラクタを作っておくことです。
2つ目は子クラスのコンストラクタの中で親クラスの引数のあるコンストラクタを呼び出す方法です。1子クラスコンストラクタの中の引数には親クラスと子クラスのコンストラクタの引数を型も含めて記述します。
baseの中にある引数は親クラスの引数のあるコンストラクタに渡しますが、ここの引数には型名を入れる必要はありません。
では先ほどの例を2つ目の方法で書き換えてみましょう。111111111111オブジェクトを作成した時にコンストラクタが実行されますが、n, a, bが親クラスのコンストラクタの引数に入ります。
そしてs, fが子クラスのsetfieldメソッドの引数に代入されることになります。
図にすると以下のようにデータが入ります。1結果は以下の通りです。1

カテゴリー
C++

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

次はクラスの継承について説明します。
「クラスの継承」とは親クラス(元のクラス)の他に「もう1つの関連したクラス」を作る時に親クラスのデータメンバやメンバ関数を引き継ぐことを言います。
「もう1つの関連したクラス」のことを子クラスもしくはサブクラスといいます。
親クラスと同じデータメンバやメンバ関数を子クラスで定義しなくてはいけない時、親クラスと同じデータメンバやメンバ関数を子クラスで再度記述する必要がなくなります。
つまり、親クラスと同じ機能を持つデータメンバやメンバ関数を子クラスで使う時に、改めて同じデータメンバやメンバ関数を子クラスで書くのは無駄ですので、そのような時にクラスの継承を使います。
また、子クラスには子クラス独自のデータメンバやメンバ関数も追加することもできます。
注意してほしいことは全く違うクラス同士を継承しても意味が無いと言うことです。
例えば銀行クラスと自動車クラスは全く違うクラスなので、継承関係にしても意味ありません(意味があればいいですが)。
継承関係が正しいかどうか悩む場合には「子クラスは親クラスの子供である」という文の「子クラス」「親クラス」に自身で作ったクラス名を当てはめてみて、違和感がないようでしたらそれは正しい継承関係です。
「銀行クラスは自動車クラスの子供である」と聞いてもおかしいと思いませんか?
違和感があるようでしたらそれは意味が無い継承です。
では継承の例を見てみましょう。11111111 では説明に入ります。
クラスの継承の基本構文は以下の通り書きます。1 この例では以下の箇所が継承クラスの箇所です。1111
ここで継承クラスのポイントを説明します。
[ポイント1]
子クラスでは親クラスのデータメンバやメンバ関数を受け継いでいるので、親クラスのメンバを使うことが出来ます。
この例では子クラスのオブジェクトから親クラスのメンバ関数に以下のようにアクセスしています(親クラスのメンバをすべて使用する必要はありません)。1 子クラスではdeposit関数を定義していないにも関わらずdeposit関数を使うことができるのが継承の意味です。
つまり、子クラスではprivate指定以外の親クラスのデータメンバやメンバ関数をすべて使うことが出来ます。
[ポイント2]
子クラスの引数のないオブジェクト1を作成した時には先に親クラスの「引数の無いコンストラクタ」が実行されてから小クラスのコンストラクタが実行されますので初めに実行されるには以下の親クラスのコンストラクタです。
この記述で親クラスのデータメンバにデータを入れているので、子クラスで親クラスのデータメンバを使うことが出来ます。
親クラスの引数の無いコンストラクタが実行された後に、子クラスの「引数の無いコンストラクタ」が実行されます。1 [ポイント3]1 親クラスの定義の中に上の記述がありますが, 親クラスのメンバがprotectedで指定されている場合は子クラスの中で、そのデータメンバやメンバ関数にアクセスできます。
以下のように親クラスでprivate指定してしまうと子クラスからはアクセスすることが出来なくなります。1 [ポイント4]
次は親クラスと小クラスで同じ名前のメンバ関数を定義した場合、どのような動きになるか見てみましょう。
この例では以下の部分で親クラスと子クラスで同じ関数名が使われています。1 親クラスと子クラスでは関数名も引数の数や型も同じ関数を作ることが出来ます(メソッドの中身はそれぞれのクラスの内容に合わせます)。
このことをオーバーライドと言います。
この例の場合、子クラスのオブジェクトから1のようにgetPoint関数を呼び出していますが、子クラスで定義された関数のほうが優先して呼び出されることになります。
この例の結果は以下の通りです。1

カテゴリー
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」になります。

カテゴリー
HTML

子孫セレクタについて知ろう

この章では子孫セレクタについて説明します。
子孫セレクタとは145の下位の階層に該当する要素にCSSを適用する場合に使います。
例えばp要素の中のstrongタグにだけCSSを適用させる時に使用します。
pはブロック要素であり、strongはインライン要素なので、pの方が上位の階層になります。
では例を見てみましょう。
この例は設定する箇所だけを書き、他は省略します。146 子孫セレクタのCSSの設定は以下の構文で行います。147 「p strong」のように要素同士を半角スペースで区切ってCSSを記述します。
この例ではp要素のstrongタグにだけ148が設定され、その他のp要素の箇所は変わりません。149 150つまり、htmlタグの中には、headタグとbodyタグがあり、 headタグの中はmetaタグやtitleタグがあり、bodyタグの中はh1やpタグがあると言うようにhtml要素を中心に下に向かって枝を広げていくようなイメージになります。
この構造において上の階層にある要素を親要素、親要素からみて下の階層にある要素を子要素、さらに子要素の下の階層が孫要素と言います。
そしてプロパティの値が親要素から子要素に引き継がれていくことを継承と言います。
では例を見てみましょう。151152 153CSSの設定が親要素bodyになされているので、その下のある子要素、孫要素に対しても154が適用されます。これがCSSの継承の意味です。
ですので、結果を見ると以下のようにbody要素内が赤くなっていることが分かります。
そこでbodyの中の特定の箇所、例えばh1を変更したい場合には155という指定の仕方が必要になります。
それが以下の箇所です。
結果的にbodyの中のh1だけが青くなります。156 その他にもpの中のstrongにだけ色を青に設定しています。
結果は以下の通りです。157