電子書籍の厳選無料作品が豊富!

・親クラスコンストラクタを呼び出すタイミングに決まりはあるのでしょうか?
・例えば、子クラスのコンストラクタではなくて、子クラスのメソッドとかで呼び出しても良いのでしょうか?

・後、親クラスコンストラクタ処理が不要な場合は、子クラスから呼ばなくても別に構わないのでしょうか?

A 回答 (2件)

言語は PHP でしたか。

PHPのクラスの仕様は特殊な上に、私自身が
PHP では継承をあまり使ったことがないので、マニュアル引き引きの
回答になりますが…。

・子クラスのコンストラクタでしか呼び出せない、という理解で合ってる
 でしょうか?
  ⇒PHPでは試したことがないうえに、マニュアルに明確なことが
   書いてないので回答しにくいのですね。少なくともその他の一般
   的な言語(CとかJAVAとか)ではその理解であっています。
   # CとかJAVAとかでは、『子のコンストラクタの最初』 以外で
   # 親のコンストラクタを呼び出すと、エラーで動きません。

   PHPではどう振る舞うか、確実なところはわかりませんが、
   やっぱりエラーになると思われます。

・暗黙の内にコールされることはありません
  ⇒PHPの仕様です。マニュアルに従って、呼び出してください。
   (他の言語からPHPに移った人は、よく引っかかる罠なんだとか)

・所有関係
  クラスAに実装した変数 (もしくはプロパティ)に、クラスBのインスタンス
  を入れた場合、『A が B (のインスタンス) を所有している』 と言います。
  この関係を親-子という場合もあります。
    • good
    • 0
この回答へのお礼

丁寧にご回答いただき、大変参考になりましたー

お礼日時:2013/04/10 21:57

使用している言語が指定されていないうえに、『親子』と言っている


関係があいまいなので回答しにくいのです。一般論で回答します。

・親子と言っている関係が継承関係で、
  親クラス=スーパークラス
  子クラス=サブクラス
 であるならば。
  ⇒ 親クラスのコンストラクタは子クラスのコンストラクタでしか
    呼び出せません。そういうことがしたいなら、親クラスに
    コンストラクタとは別に初期化用のメソッドを作るのが普通
    です。
  ⇒ 親クラスのコンストラクタ呼出を省略することが可能な言語も
    あります。(普通はデフォルトコンストラクタ (引数なしのコンス
    トラクタ) が自動的に呼び出されます)

・親子と言っている関係が所有関係で、
  親クラス=子クラスを所有する
 であるならば。
  ⇒ 実装次第で子クラスのメソッドから呼び出すことも不可能
    ではありません。インスタンスの管理をキチンとしないと
    親クラスが必要以上に生成されてしまう可能性がありますけどね。
  ⇒ 親クラスのコンストラクタを呼ばないと、インスタンスができません。
    質問自体がナンセンスです。

この回答への補足

回答ありがとうございます。
言語はPHPで、親子は継承関係の意味で質問しました。

改めて確認したら、「子クラスのコンストラクタの 中で」と書いてありましたので、
子クラスのコンストラクタでしか呼び出せない、という理解で合ってるでしょうか?
▽PHP: コンストラクタとデストラクタ - Manual
  http://php.net/manual/ja/language.oop5.decon.php


>親クラスのコンストラクタ呼出を省略することが可能な言語もあります
PHPは、親クラスのコンストラクタを利用する場合は、子クラス(のコンストラクタ)で明示的に呼び出す必要があると思うのですが、利用したくない場合は、呼び出さなくても良いのでしょうか?

>暗黙の内にコールされることはありません
と書いてあったので、推奨されていない、というか、必ず呼び出すようにした方が良いのかな、と思い、質問しました

>所有関係で、親クラス=子クラスを所有する
所有関係、って初めて聞いた言葉なのですが、どういう意味なのでしょうか?

補足日時:2013/04/07 18:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!