- ベストアンサー
親クラスコンストラクタを呼び出すタイミングについて
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
言語は PHP でしたか。PHPのクラスの仕様は特殊な上に、私自身が PHP では継承をあまり使ったことがないので、マニュアル引き引きの 回答になりますが…。 ・子クラスのコンストラクタでしか呼び出せない、という理解で合ってる でしょうか? ⇒PHPでは試したことがないうえに、マニュアルに明確なことが 書いてないので回答しにくいのですね。少なくともその他の一般 的な言語(CとかJAVAとか)ではその理解であっています。 # CとかJAVAとかでは、『子のコンストラクタの最初』 以外で # 親のコンストラクタを呼び出すと、エラーで動きません。 PHPではどう振る舞うか、確実なところはわかりませんが、 やっぱりエラーになると思われます。 ・暗黙の内にコールされることはありません ⇒PHPの仕様です。マニュアルに従って、呼び出してください。 (他の言語からPHPに移った人は、よく引っかかる罠なんだとか) ・所有関係 クラスAに実装した変数 (もしくはプロパティ)に、クラスBのインスタンス を入れた場合、『A が B (のインスタンス) を所有している』 と言います。 この関係を親-子という場合もあります。
その他の回答 (1)
使用している言語が指定されていないうえに、『親子』と言っている 関係があいまいなので回答しにくいのです。一般論で回答します。 ・親子と言っている関係が継承関係で、 親クラス=スーパークラス 子クラス=サブクラス であるならば。 ⇒ 親クラスのコンストラクタは子クラスのコンストラクタでしか 呼び出せません。そういうことがしたいなら、親クラスに コンストラクタとは別に初期化用のメソッドを作るのが普通 です。 ⇒ 親クラスのコンストラクタ呼出を省略することが可能な言語も あります。(普通はデフォルトコンストラクタ (引数なしのコンス トラクタ) が自動的に呼び出されます) ・親子と言っている関係が所有関係で、 親クラス=子クラスを所有する であるならば。 ⇒ 実装次第で子クラスのメソッドから呼び出すことも不可能 ではありません。インスタンスの管理をキチンとしないと 親クラスが必要以上に生成されてしまう可能性がありますけどね。 ⇒ 親クラスのコンストラクタを呼ばないと、インスタンスができません。 質問自体がナンセンスです。
補足
回答ありがとうございます。 言語はPHPで、親子は継承関係の意味で質問しました。 改めて確認したら、「子クラスのコンストラクタの 中で」と書いてありましたので、 子クラスのコンストラクタでしか呼び出せない、という理解で合ってるでしょうか? ▽PHP: コンストラクタとデストラクタ - Manual http://php.net/manual/ja/language.oop5.decon.php >親クラスのコンストラクタ呼出を省略することが可能な言語もあります PHPは、親クラスのコンストラクタを利用する場合は、子クラス(のコンストラクタ)で明示的に呼び出す必要があると思うのですが、利用したくない場合は、呼び出さなくても良いのでしょうか? >暗黙の内にコールされることはありません と書いてあったので、推奨されていない、というか、必ず呼び出すようにした方が良いのかな、と思い、質問しました >所有関係で、親クラス=子クラスを所有する 所有関係、って初めて聞いた言葉なのですが、どういう意味なのでしょうか?
関連するQ&A
- コンストラクタとデリゲートの意味を教えてください。
コンストラクタは、起動時に自動生成される処理のことをいいますか? 1度だけ実行されるクラスをコンストラクタと言っているのですか??? デリゲートは、クラスからメソッドを呼び出すことをデリゲートといいますか? クラスから処理を別に渡すとそれはデリゲートですか???
- ベストアンサー
- Visual Basic
- PHP5 コンストラクタや初期化の意味がわからない
プログラミング初心者です。本を参考にしてPHPを勉強しています。 クラスの章でコンストラクタについて以下のように書かれていました。 コンストラクタはインスタンス化のタイミングで実行されるという性質上、 プロパティ(メンバ変数)やクラスで使用する各種リソースの初期化 といった処理を記述するのが一般的です。 初期化処理が不要な場合、コンストラクタは省略可能。 ここで質問です。 インスタンス化を行うのは初期化するためということでしょうか? 「~といった処理を記述するのが一般的」ということは、初期化が 本来の目的ではないという意味にもとれますがどうなんでしょうか。 また静的メソッドについては、 「インスタンス化を行わなくても利用できるメソッド」 と書かれていましたが、何がどう違うのか分かりません。 初期化とは何でしょうか?またなぜ初期化を行うのでしょうか? 静的メソッドと何が違うのでしょうか?
- ベストアンサー
- PHP
- 親クラスのポインタ、クラスを指定しないポインタ
親クラス A (抽象メソッドX、Yの2つを持つ) と 子クラス B-1 (親はA、抽象メソッドX、Y、Zの3つを持つ) 子クラス B-2 (親はA、抽象メソッドX、Y、Wの3つを持つ) のように、子クラスでポリモーフィズムを実現しているとき、 クラスC 「実行時に、iniファイルに(1)と書かれていたら、B-1のクラスで実体化し、 iniファイルに(2)と書かれていたら、B-2のクラスで実体化する」 というクラスを作りたいです。 //////////////////////////////////////////////////////////////// 質問(1) その際、クラスCは、どうやってもZのメソッドや、Wのメソッドは書けない認識です。 (メソッド名もiniファイルから取るようにすれば別でしょうが。) この認識であっていますでしょうか? 質問(2) 逆に、XとYについては、それぞれ挙動の違う処理を行わせることができる認識です。 (クラスCで、親クラスAのポインタ型の変数を用意しておき、 そのポインタに、DLLのインスタンス化したものをいれておけば、 メソッドXとYについては実行可能という認識です)
- ベストアンサー
- C・C++・C#
- コンストラクタって?
↓ ↓ ↓ クラスを基にインスタンス化を行いますが このときに初期化を行わなくてはならないことがあります。 それを実現するのが「コンストラクタ」です。 のような解説はたくさん読んできたのですが 具体的にどういう場合にコンストラクタを使用するのでしょうか? プログラムには必ずコンストラクタは必要なんですか? 例えばシューティングゲームを作るときの こういう処理にコンストラクタが役立つんだよー! などという具体的な例があればぜひ教えてください。 どなたかご協力よろしくお願いします!
- ベストアンサー
- Java
- 親クラスから子クラスへアクセス。
親クラスから子クラスへアクセス。 お世話になります。 以下のプログラムについて考えています。 public class Main{ public static void main(String[] args) { SubA subA = new SubA(); SubB subB = new SubB(); Super[] subs = {subA,subB}; subs[1].method(); subs[2].method(); } } class Super{ String str = "親"; public void method(){ System.out.println(str); } } class SubA extends Super{ String str = "子A"; } class SubB extends Super{ String str = "子B"; } この場合、出力結果は当然 親 親 になります。 これを子クラスの str を表示するようにしたいのです。つまり 子A 子B です。 ただし、子クラスで method() をオーバーライドしたり、super.str = "子A" のように親クラスを書きかえずにです。 子クラスが何百種類もある場合、全く同じmethod()を書く無駄や、変更があったときにそれを全てを修正しなければならないことを避けたいのです。 何か良案がありましたら、ぜひご教授ください。よろしくお願いします。
- 締切済み
- Java
- 【.NET】コンストラクタをあとで呼出す方法
.NET初心者です。 今VB.NETでVB6向けの自作COMクラスライブラリを作成しています。 自作クラスはStreamWriterクラスのラッパークラスとしてStreamWriterと継承関係にあります。 COMは引数なしのコンストラクターを一つ用意しなければなりませんが、 StreamWriterクラスは引数なしのコンストラクタを用意されていないため困っています。 自作クラス自身もFileクラスのラッパークラスで引数として使う必要があるため 継承関係を維持してVB6に公開する必要があります。 この問題をなんとか解決する手法って存在するのでしょうか? ちなみにほかに考えた手法は下記です。 ・プロパティーに StreamWriterのインスタンスを用いて継承関係なしであとでinitメソッドを呼び出す →Fileラッパークラスの引数でStreamWriter型に代入出来ないため不可 ・StreamWriterを引数に取るメソッドの実装をあきらめる →極力したくない ・StreamWriterラッパークラスの引数なしコンストラクタでStreamWriterクラスの引数ありコンストラクタを呼ぶ →後でファイルのパスを指定する方法が見つからないため不可 他言語はそれなりにやってきたのでコンストラクターをあとで呼び出すなんて出来ないのはなんとなくわかるのですが何せ.NETを触り始めたのが最近なのでよろしくお願い致します。
- ベストアンサー
- Visual Basic
- スーパークラスのコンストラクタの処理を引き継ぐ
基本情報18年秋のJava問題問12の設問1(a)の問でわからないことがあるので教えてください。 スーパークラスを継承したクラスのコンストラクタ内の処理を、スーパークラスのコンストラクタと同じ処理する場合の記述についてです。 問題と解答(http://www.jitec.jp/1_04hanni_sukiru/mondai_kaitou.html#18aki)はここですが、簡単に書くと、次のようになります。 抽象クラスBook abstract class Book { String name; String id; Book(String name, String id) { this.name = name; this.id = id; } ~ } Bookを継承したRegularBook class RegularBook extends Book { RegularBook(String name, String id) { ここが穴埋め ; } ~ } 穴埋めの解答群5つのうちの2つが次のとおりです。 エ super(name, id) オ this.name = name; this.id = id もちろんエが正解です。 普通ここにエの記述をするのはわかるのですが、なぜ「オ」が「絶対に間違い」と言い切れるのかが分からないのです。 スーパークラスのコンストラクタ内の処理が変更になった場合、それを継承するクラスのコンストラクタの処理にも反映されるとか、そういう意味でもエの書き方は便利だとは思いますが、オも絶対に間違いといいきれないのでは?? お尋ねしたいのは、情報処理試験の問題として、絶対に間違いでない選択肢を2つ以上もいれるはずもないので、オは「なにがなんでも間違い」なんだろうけれどもその理由が分からないのです。 オが確実に間違っているという理由が分かりましたら教えてください。よろしくおねがいいたします。
- 締切済み
- Java
- JavaScriptからJAVAクラスを呼び出す
JavaScriptからJavaクラスのメソッドやコンストラクタを呼び出す事ってできるのでしょうか? 今、行おうとしているのが、テキストにて入力した後に日付編集(4200812 → H20. 8. 12に変換)処理を行うというものです。 初期表示時は、Javaクラスで変換して表示させるので、大丈夫なのですが、どうしても入力したタイミングで変換させるには、JavaScriptを使用しなければなりません。 そこで、JavaScriptに元号情報やJavaで記述した制御などを記載すればできると思いますが、面倒臭いので、JavaScriptからJavaクラスのメソッドが実行できればなと思います。 そのような事はできるのでしょうか?? JDKは1.6です。
- ベストアンサー
- JavaScript
- djUnit コンストラクタがprivateでテストが行えない
djUnit コンストラクタがprivateでテストが行えない djUnitを使っております。 テスト対象のメソッドにアクセスしてテストを行いたいのですが、 どうもそれができません。 理由としては、コンストラクタがprivateになっているから?です。 (「コンストラクター TestManager() は不可視です」というエラーが出ます。) コンストラクタのprivateを消せば、テスト対象のメソッドにアクセスできるのですが、 実際には消してテストをしてはだめということになっています。 コンストラクタがprivateでもdjUnitでテストが行える方法がございましたら、 書き方をご教授いただけないでしょうか? どうかよろしくお願いいたします。 一応下記が詳細です。 (クラス名、コンストラクタ名、メソッド名) ------------------------ [クラス] public final class TestManager [コンストラクタ] private TestManager() { } [テスト対象のメソッド] public Structure testCreate(byte[], byte[], byte[]) ----------------------- 色々試したのですが、途中で終了してしまって 目的のテスト対象のメソッドを実行するところまで辿りつけません・・・。 [お試しパターン1] Class c = TestManager.class; Constructor[] con = c.getDeclaredConstructors(); TestManager conIns = (TestManager)con[0].newInstance(); //ここで処理が終了してしまう [お試しパターン2] Class testClass = Class.forName("TestManager"); //ここで処理が終了してしまう Constructor[] TestManager = testClass.getDeclaredConstructors(); TestManager[0].setAccessible(true); Object conIns = TestManager[0].newInstance((Object[])null); TestManager test = (TestManager)conIns;
- ベストアンサー
- Java
お礼
丁寧にご回答いただき、大変参考になりましたー