次回予告: ・p.243「クラスの継承とコンストラクタ」から 講義メモ:memo20250831.txt
for trainees of Hirano's class only
次回予告: ・p.243「クラスの継承とコンストラクタ」から 講義メモ:memo20250831.txt
p.232 多態性 ・クラスの継承は基本クラスを代表とする派生クラスのグルーピングにもなる ・例: Slimeクラスを継承するHoimiSlimeクラス、MetalSlimeクラスは「スライムの一族」 ・よって、派生クラスのオブジェクトは、基本クラスを型とする変数に代入できる ・例: HoimiSlimeクラスのホイミンは、Slimeクラスのホイミンとしても扱える(メンバを引き継いでいるので) ・このとき、メソッドにおいて名前の隠蔽が起こっていると、基本クラスを型とする変数でメソッドを呼ぶと、基本クラスのメソッドが実行される ・しかし、メソッドにおいてオーバーライドが起こっていると、基本クラスを型とする変数でメソッドを呼んでも、 派生クラスのオーバーライドメソッドが実行される ・このことを多態性(ポリモフィズム)という ・例: Slimeクラスの仮想メソッドはHPのみ表示、継承するHoimiSlimeクラスのオーバライドメソッドはHPとMPを表示する場合: HoimiSlimeクラスのホイミンは、Slimeクラスのホイミンとして扱っても、メソッドを呼ぶとオーバライドメソッドが動作してHPとMPを表示 ・この「どのメソッドが実行されるかが実行時に決まる仕組み」を動的メソッドディスパッチャという ・例: class Slime { //基本クラス int hp; //基本クラスのインスタンス変数メンバ public virtual void show() { //仮想メソッド Console.Write(hp); } } class HoimiSlime : Slime { //派生クラス // ここに「int hp; //基本クラスのインスタンス変数メンバ」があるとみなされる int mp; // ここに「public virtual void show() {…} //基本クラスの仮想メソッド」があるがオーバーライドされる public override void show() { //オーバーライドメソッド Console.Write(hp + ", " + mp); } } HoimiSlime hoimin = new HoimiSlime(); //ホイミンをホイミスライムとして生成 Slime slime1 = hoimin; //ホイミンをスライムクラスのスライム1号として扱う slime1.show(); //スライム1号はSlimeだが、多態性により中身がホイミンと分かりオーバライドメソッドが呼ばれる アレンジ演習:p.233 override02.cs ・名前の隠ぺいでは(オーバーライドは異なり)多態性が起こらないことを確認しよう ・Dogクラスに名前を隠ぺいするLeg()メソッドを追加し「return 0;」としてみよう 作成例 //アレンジ演習:p.233 override02.cs using System; class Mammal { //基本クラス「哺乳類」 protected const int LegNo = 4; //継承可能なインスタンス変数(定数) protected string Koe; //継承可能なインスタンス変数 public virtual string Nakigoe() { //オーバーライド可能な仮想メソッド Koe…
・p.223「第9章 継承」から 提出フォロー p.222 練習問題2 ヒント ex0802.cs ・p.217 indexer03.csをベースにすると良い ・コンストラクタで生徒数を入力する部分は、p.214 indexer02.csが参考になる ・生徒名を格納するstring型配列と、点数を格納するint型配列を宣言して用いると楽 ※ 生徒名と点数をメンバとするクラスオブジェクトの配列にできればさらに良い ・要素の生成はコンストラクタで行うと良い ・Mainメソッドで格納結果を表示すること 作成例 //p.222 練習問題2 ex0802.cs using System; class MyIndexer { int[] point; //点数の配列の宣言 string[] name; //名前の配列の宣言 int num; //要素数(メソッドで設定) public int this[string Name] { //文字列をインデックスとするインデクサ① get { for (int i = 0; i < num; i++) { //配列の全要素について if (Name == name[i]) { //名前と一致? return point[i]; //点数を返す } } return -1; //一つも一致しなかったら-1を返す(0点だとあり得るので) } set { for (int i = 0; i < num; i++) { //配列の全要素について if (Name == name[i]) { //名前と一致? point[i] = value; //点数を格納 } } } } public string this[int i] { //添字をインデックスとするインデクサ② get { return name[i]; //名前[i]を返す } set { name[i]…
ゲームソフト販売本数ランキング:今週1位も「マリオカート ワールド(Switch2)」 GO! 東京都、生成AI活用「モバイルアプリコンテスト」中高生対象 GO! Epic GamesのCEO語る「UE5最適化問題」の原因と改善策。ハイスペック基準の開発工程が落とし穴と分析 GO! Windows 11最新アプデでSSDが壊れる不具合「Windows側の問題」とPhison調査結果公表も社員再現できず GO! ユービーアイが『ザ・ローグ:プリンス オブ ペルシャ』を“インディー規模”と宣伝して物議醸す―「開発はインディー」vs「大企業の資金が入っている」GO!
・プロパティ作成においてgetとsetは必ず一対をなすのでしょうか。 とは限りません。どちらかのみでもOKです。 よくあるパターンとしては、データメンバを外部からの書き換え不可(Read Only)にするために、 データメンバをprivateにして、setを省略したプロパティを提供することが多用されています。 例えば、モンスターのHPの初期値をコンストラクタで与え、増減のみをメソッドで行う場合です。 ・プロパティとインデクサのアクセッサであるgetとsetは両方が必ず必要と言うわけではないとのことですが、setのみを使う場合もあるということでしょうか? その通りです。getが不要な場合は記述不要です。 よくあるパターンとしては、データメンバに外部から変数値を与えることができるが、 クラス内部で値を書き換えることは無いので、外部の処理ではその変数値を使用することがあります。 例えば、各モンスターの名前を配列の要素値から代入し、表示には要素値を用いる場合です。
次回予告:p.223「第9章 継承」から 講義メモ:memo20250824.txt p.222 練習問題2 ヒント:インデクサの定義部分 class MyIndexer { int[] point; //点数の配列の宣言 string[] name; //名前の配列の宣言 int num; //要素数(メソッドで設定) public int this[string Name] { //文字列をインデックスとするインデクサ① get { for (int i = 0; i < num; i++) { //配列の全要素について if (Name == name[i]) { //名前と一致? return point[i]; //点数を返す } } return -1; //一つも一致しなかったら-1を返す(0点だとあり得るので) } set { for (int i = 0; i < num; i++) { //配列の全要素について if (Name == name[i]) { //名前と一致? point[i] = value; //点数を格納 } } } } public string this[int i] { //添字をインデックスとするインデクサ② get { return name[i]; //名前[i]を返す } set { name[i] = value; //名前[i]に格納 } } public MyIndexer(int i) { //要素数を受け取るコンストラクタ point = new int[i]; //引数で受け取った要素数で点数の配列本体を生成 name…
p.212 文字列をインデックスとするインデクサ ・整数ではないインデックスを受け取ってインデクサの中で配列の要素にアクセスする処理を記述することができる ・よって、文字列をインデックスとするインデクサや、実数をインデックスとするインデクサも可能になる アレンジ演習:p.217 indexer03.cs ・実数をインデックスとするインデクサを追加して、動作を確認しよう 作成例 //アレンジ演習:p.217 indexer03.cs using System; class MyIndexer { string[] mon = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; public int this[string MonthName] { //文字列をインデックスとするインデクサ get { for (int i = 0; i < 12; i++) { //配列の全要素について if (MonthName == mon[i]) { //月名と一致? return i + 1; //添字+1を返す } } return 0; //一つも一致しなかったら0を返す } } public string this[double n] { //【以下追加】実数をインデックスとするインデクサ get { if (n >= 1.0 && n < 13.0) { //1以上13未満であれば return mon[(int)n – 1]; //整数化して添字にして月名を返す } return ""; } } } class indexer03 { public static void Main() { MyIndexer mi = new MyIndexer(); Console.WriteLine("Mayは{0}番目の月です",…
・p.207「プロパティ」から 提出フォロー:アレンジ演習:p.205 static03.cs ・静的メソッドSetCatTail()の中の「// name = "マイケル";」をコメントアウトしないと、どういうエラーになるか確認しよう ・静的メソッドSetCatTail()の中で、インスタンスメソッドShowCat()を呼ぶとエラーになることを確認しよう ・静的メソッドSetCatTail()の中で、thisを用いるとエラーになることを確認しよう ・以上は、確認後、コメントアウトすること 作成例 //アレンジ演習:p.205 static03.cs using System; class Cat { static int NoOfTail; //静的データメンバ(猫の尾の数は猫に所属) string Name; //インスタンス変数(名前はインスタンスに所属) public void SetName(string strName) { //インスタンスメソッド Name = strName; //インスタンス変数を用いるので } public void ShowCat() { //インスタンスメソッド if (Name == null) { //インスタンス変数を用いるので Console.WriteLine("名前が設定されていません"); return; } Console.WriteLine("猫の名前は{0}で尾の数は{1}本です", Name, NoOfTail); //静的データメンバを用いることも可能 } public static void setCatTail(int no) { //静的メソッド //ここでインスタンスフィールドにアクセス不可 // Name = "マイケル"; //インスタンス変数にはアクセスできない NoOfTail = no; //静的データメンバにはアクセスできる // ShowCat(); //インスタンスメソッドは呼び出せない // this.Name = ""; //thisは使えない } } class static03 { public static void Main() { Cat.setCatTail(1); //静的メソッドを呼ぶ Cat mycat = new Cat(); Cat yourcat = new Cat(); mycat.ShowCat(); //インスタンスメソッドを呼ぶ mycat.SetName("マイケル"); //同 yourcat.SetName("パトリシア"); //同 mycat.ShowCat(); //同…
ゲームソフト販売本数ランキング:今週1位は再び「マリオカート ワールド(Switch2)」 GO! 【イベント告知】アカマイが「Akamai Cloud Day 2025」を9月24日に開催。特別セッションに安野貴博氏が登壇、ソニーグループや時雨堂の事例も GO! 赤字スタートのセガ、逆襲の鍵は『ソニックレーシング』と待望の『Football Manager』か【ゲーム企業の決算を読む】GO! 業績は減益、株価は高値。スクエニに迫る「物言う株主」の影【ゲーム企業の決算を読む】GO! グリーの2025年6月期決算は売上6.8%減―新作『まどドラ』投入もゲーム事業はQoQで減収【ゲーム企業の決算を読む】GO! 【キャリアクエスト】「これ、あったら面白い」を実際に作り出せる。セガ入社3年目の若手が語るプランナーという職種、そして自身の展望とは GO! マイクロソフト「Windows 11高負荷時にSSDを破損する不具合再現できず」と声明。一方Phisonは「Windows側の問題」と調査結果公表 GO! DDoS・Bot攻撃との“いたちごっこ”に終止符を──AkamaiとCygamesが語る、費用対効果と自動化を両立するセキュリティ戦略【CEDEC2025レポート】GO!
・静的メンバとインスタンスメンバが混在するケースは多いのでしょうか? クラスの設計によりますが、ごく普通です。 敢えて、静的クラスにしている場合を除き、基本的にはインスタンスメンバで構成しますが、 必要であれば、静的メンバを加えるというパターンが多いように思います。 なお、混在を認めないチームルールにしている場合もあるようです。 ・以下のエラーを確認しました。 Name = “マイケル”; 静的でないフィールド、メソッド、またはプロパティ‘CatName’で、オブジェクト参照が必要です ShowCat(); 静的でないフィールド、メソッド、またはプロパティー‘Cat.ShowCat()’で、オブジェクト参照が必要です this.Name = “”; キーワード‘this’は、静的プロパティ、静的メソッド、または静的フィールド初期化子では無効です 何よりです。 ・すみません、ファイルの添付を忘れました。 提出は何回でもOKです。