• 締切済み

派生クラスはプロパティを継承するとは

hdnssdの回答

  • hdnssd
  • ベストアンサー率100% (2/2)
回答No.1

class 剣士{ int HP; int MP; } class 魔法使い{ int HP; int MP; } とやってしまうと モンスターが攻撃する時 atack(剣士 k){ k.HP - 10; } atack(魔法使い m){ m.HP - 10; } な感じになるので class 味方{ int HP; int MP; } を用意して class 剣士 extends 味方{ // HPとMPは継承している } class 魔法使い extends 味方{ // HPとMPは継承している } にするんです。 そうするとモンスターは atack(味方 a){ a.HP - 100; } でどっちも攻撃できるんです。このとき剣士と魔法使いという派生クラスはHPとMPというプロパティを継承してると言うんだと思います。

rescue99
質問者

お礼

ありがとうございます。 それ継承では?? 味方が派生クラスということですか? 味方は剣士と魔法使いを継承してるだけなんですけど、 モンスターがHP - 100の攻撃をすると両者-100ですか? それとも、-50ずつですか? なんか派生クラスと違うw

関連するQ&A

  • private継承はどう使う?

    C++の話です class Base{.....}; class Derived1 : public Base{.....}; class Derived2 : private Base{.....}; と書くことができますが、public継承とprivate継承にはそれぞれ意味がありますよね。 public継承は"is-a"関係を意味していて、private継承は "is-implemented-in-terms-of"関係を表していると言います。 public継承を実際に動くプログラムは思いつくのですが、private継承を使ったプログラムが思いつきません(というより有効に使えません) 派生クラスから呼び出せない、外部からも呼び出せないメンバをどう使うのでしょうか?

  • 【PHP】クラスを継承した際にデータ型も継承すると

    とある有料のオンライン学習サイトをつかっています。 学習項目の流れは以下の通りです。 現在「15 型の継承について見ていこう」で躓いています。 01 オブジェクトを使ってみよう (02:56) 02 投稿に関する処理を作ろう 03 クラスでデータ型を定義しよう 04 インスタンスを作ってみよう 05 コンストラクタを使ってみよう 06 クラスを整理しておこう 07 アクセス修飾子について見ていこう 08 メソッドを介してプロパティを操作しよう 09 プロパティで型宣言をしてみよう 10 staticキーワードを使ってみよう 11 オブジェクト定数を使ってみよう 12 クラスを継承してみよう 13 子クラスで独自の実装をしていこう 14 メソッドをoverrideしてみよう 15 型の継承について見ていこう *型の継承 *型を継承するメリット この項目で記述されているソースコードは下記のとおりです。コード内のクラス、SponsoredPostは クラスPostを継承しています。よって両方のクラスともにPost型として扱えると説明があります。 ソース内のこの箇所で processPostという関数を作成し、変数$postにPost型と型付けをしています そしてforeachでPostで型付けられた$post型(クラスPostとそれを継承したクラスSponsoredPost)をひとつづつ取り出し、processPostを用いてそれぞれにshow()メソッドで表示させています。 ----------------------- <?php class Post{ protected $text; public function __construct($text){ $this->text = $text; } public function show(){ printf('%s',$this->text); } class SponsoredPost extends Post{ private $sponsor; public function __construct($text, $sponsor){ parent::__construct($text); $this->sponsor = $sponsor; } public function show(){ printf('%s by %s', $this->text, $this->sponsor); } } $posts = []; $posts[0] = new Post('hello'); $posts[1] = new Post('hello again'); $posts[2] = new SponsoredPost('iPhone','Apple'); function processPost(Post $post){ $post->show(); } foreach($posts as $post){ processPost($post); ------------- クラスを継承すると親クラスのプロパティやメソッドが子クラスに継承されるというのは理解できています。「15 型の継承について見ていこう」という項目では 『Post型の変数を受け取る関数を作って、データ型が継承されることを説明していきます。』 と解説してあります。 クラスを継承すると親クラスのプロパティやメソッドが子クラスに継承されるというのは理解できています。私の知っているデータ型(文字列型、整数型、浮動小数点数型、論理型、配列型、オブジェクト型、リソース型、NULL)は下記の2か所だけです。 show()メソッド内の、['%s']と['%s by %s']で文字列が指定されています。 したがってこの項目で説明されている 『Post型の変数を受け取る関数を作って、データ型が継承されることを説明していきます。』 とは、「クラスを継承する際にプロパティやメソッドだけでなく、データ型、ここでは(['%s']と['%s by %s'])も継承されるということが説明されているという解釈でよろしいのでしょうか? 少し混乱しています。もし私の解釈が間違っているようでしたら教えてください。 初学者です。よろしくお願いいたします。 <表示結果>

    • ベストアンサー
    • PHP
  • 基底クラスと派生クラスがわかりません

    javascriptを勉強してるんですが基底クラスや派生クラスという言葉がでてきます よくわかりません(´;ω;`) 教えてください!お願いします!

  • MenuStripの継承でプロパティが反映されない

    お世話になっております。 Visual Studioを使用してプログラムを実施しております。 MenuStripクラスを継承した自作クラスAをFormに張り付けて、 自作クラスBを作成しました。 Visual Studio上で、自作クラスBを開き、自作クラスAのプロパティ「Items」を使用して メニューアイテムの設定を変更しようとしているのですが、「Items」の設定が、自作クラスB のデザイナに反映されず困っております。。。 MenuStripを継承したクラスの場合、設定されているメニューアイテムの設定は 変更できないのでしょうか。

  • 派生クラスを含む配列について

    VisualStudio.NETの開発経験があまり無い者です。 WEBサービスを使った開発をするのですが、 対象のメソッドの引数に、特定のクラスの配列を指定するようになっているのですが、 実際にこの引数には、そのクラスの派生クラスのいずれかが入るような感じになっています。 例:ABC(X[]) 引数Xは基底クラスの配列。でもここにはXの派生クラスYやZなどが入る このような場合の実際の指定方法がわかりません。 どのようにしたらよいのでしょうか?

  • 基本クラスのポインタで、派生クラスのメンバ関数を呼び出す方法?

    VC++でプログラミングをしています。 A(基本クラス) B(派生クラス) を作成しました。Bは、Aの特別な場合です。 このとき、基本クラスAのポインタから、派生クラスBにのみあるメンバ関数を呼ぶことはできないのでしょうか? 基本クラスAにも同じ名前の関数があれば、仮想関数をオーバーロードすれば呼び出せるようですが、この関数は、基本クラスには不要なので、できれば使わないメンバ関数を基本クラスに書きたくありません。 (純粋仮想関数という方法もあるようですが、) 操作としましては、 Aのポインタ配列 A* a[100]を作成し 特別な場合のみ派生クラスBのメンバ関数だけを実行させたいのです。 派生クラスにのみあるメンバ関数を、Readとします。 for(i=0;i<100;i++){ if(派生クラスBの場合){ a[i]->Read() } } 現状では、コンパイルエラーで、 関数Readは、aのメンバ関数ではありませんとなってしまいます。 以上よろしくお願いします。

  • クラス型配列が派生クラス内フィールドを認識しません

    初めまして、お世話になります。JAVAの入門者です。継承のところまで進みましたが、代入と配列のクラス化で困っています。 環境は、Windows7 professional、JDK1.6.0_33、エディターはnotepad++ないしEclipse4.2です。プログラムは以下のとおりです: class PersonalData{ //継承元クラス String name; String phoneNumber; public String getContact(){ return name + "の連絡は" + phoneNumber + "に電話です"; } } class MailPersonalData extends PersonalData{ //派生クラス String mailAddress;  //問題となっているフィールド public String getContact(){ //オーバーライド return name + "の連絡は" + mailAddress + "にメールです"; } } public class Main{ //実行クラス public static void main(String[] args){ PersonalData[] pdArray = new PersonalData[100]; MailPersonalData mpd = new MailPersonalData(); PersonalData pd = new PersonalData(); pdArray[0] = mpd; //代入 pdArray[1] = pd; pdArray[0].name = "ジョン"; pdArray[0].mailAddress = "xx@xxxx"; //ここでエラー発生 pdArray[1].name = "ポール"; pdArray[1].phoneNumber = "012-345-6789"; System.out.println(pdArray[0].getContact()); System.out.println(pdArray[1].getContact()); } } というプログラムを作りましたが、コマンドプロンプトによるコンパイル時に Main.java27:シンボルが見つけられません シンボル:変数 mailAddress 場所:PersonalDataのクラス pdArray[0].mailAddress="xx@xxxx" ^   (^は.の直下にあります) とエラーが出てしまいます。Eclipse4.2では「解決できないか、フィールドではありません」と表示されます。 プログラム23行目のpdArray[0] = mpd; の代入によりpdArray[0]を派生クラス型にしましたが、派生クラス内のフィールドmailAddressがmainでは認識されていないようです。継承元クラスに記述されているphoneNumberはフィールドとして認識されています。 配列ではなくpd0、pd1といった個別のクラス型変数を作成した場合はmailAddressもフィールドとして認識され期待している結果が得られました。期待している結果は次のとおりです: ジョンの連絡はxx@xxxxにメールです ポールの連絡は012-345-6789に電話です 教えて!gooに似た質問がありましが、少し違うようです。(http://okwave.jp/qa/q1201607.html) その他、googleでキーワードに配列のクラス化、継承、オーバーライドなどを用いて検索しましたが解決法は得られませんでした。 なにぶん初心者の為、非常に的外れなことをやっていると思い誠に恐縮ですが、どうかご容赦ください。御教授のほど何卒宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • 抽象クラスの継承について

    すいませんがご教授下さい。 ASP.NETとVB.NETを使用してアプリを開発しています。 存在するクラスは以下のようなクラスです。 (WebForm1.aspxとWebForm1.aspx.vbとClass1.vb(抽象クラス)があります。) したい事はClass1.vbをWebForm1.aspx.vbが継承したいのですが継承させた後にWebForm1.aspxを開こうとすると「Webフォームデザイナにファイルを読み込めませんでした。・・・・」とエラーポップアップが表示されます。「はい」でHTMLは見れるのですがデザインはタブ自体がないです。普通のクラスを継承させると問題ないのですが。抽象クラスだとエラーになります。 対処方を教えて下さい。

  • C++を勉強し始めたばかりの初心者なのですが、クラスの継承に関して・・・

    Visual C++ 2008で、新しいwindowsフォームアプリケーションを作成したら、Form1.hの上の方に public ref class Form1 : public System::Windows::Forms::Form という行がありました。これは開発環境に実装されている System::Windows::Forms::Formクラスを継承し、Form1クラスを新たに作成しますという意味なのですよね? このとき、2つ目のpublicは、継承の仕方、この場合結果的にはSystem::Windows::Forms::Formクラスに含まれるメンバの、private以外がそのまま受け継がれる、という事になりますよね? それで、このref classというのは、ポインタみたいな意味でしょうか?refは書かないと別の継承方法になるのでしょうか? また、最初のpublicはどういう意味なのでしょう? もしかして、この2つについては、System::Windows::Forms::Formクラスを継承して新規フォームを作る場合の、定型みたいなものなのでしょうか?

  • 構造体からクラスを派生させる方法

    実は今大学に通っていてC++の授業を取っているのですが、この間構造体からクラスを派生させると言う部分の講義があったんです。ですがその回、都合で欠席してしまい方法が分かりません。周りの学生に聞いてもよく分からず本等で調べても構造体から派生させる所は載っていませんでした。どなたか「構造体からクラスを派生させる方法」を知っていたら教えて下さい(私の予想では基本クラス名を書く所を構造体名にすればいいのだと思うのですが)普通にクラスから派生させる時との違いや注意点等も分かりましたらお願いします。 まだ習い始めたばかりなので幼稚な質問になってしまったかもしれませんがよろしくお願いします。