講義メモ:memo20250914.txt 以上となります。 講義の進行にご協力をありがとうございました。 このサイトは「ある限り」残しておきますが、いつか消えます。ご了承ください。
for trainees of Hirano's class only
講義メモ:memo20250914.txt 以上となります。 講義の進行にご協力をありがとうございました。 このサイトは「ある限り」残しておきますが、いつか消えます。ご了承ください。
p.266 インターフェイスの継承 ・クラスと同様にインターフェイスが継承が可能 ・継承される側を基本インターフェイス、する側を派生インターフェイスと呼ぶ ・クラスと同様に継承できるインターフェイスは1つのみで、派生インターフェイスの継承は可能 アレンジ演習:p.266 interface06.cs ・派生インターフェイスIInterface2を継承するIInterface3を追加できることを確認しよう ※中身は自由 作成例 //アレンジ演習:p.266 interface06.cs using System; interface IInterface1 { //基本インターフェイス① void setdatano(int n); //抽象メソッド① void setdata(double data, int i); //抽象メソッド② double calcsum(); //抽象メソッド③ } interface IInterface2 : IInterface1 { //派生インターフェイス② //ここに void setdatano(int n); //抽象メソッド①があるとみなされる //ここに void setdata(double data, int i); //抽象メソッド②があるとみなされる //ここに double calcsum(); //抽象メソッド③があるとみなされる double calcaverage(); //抽象メソッド④ } interface IInterface3 : IInterface2 { //【以下追加】派生の派生インターフェイス③ //ここに void setdatano(int n); //抽象メソッド①があるとみなされる //ここに void setdata(double data, int i); //抽象メソッド②があるとみなされる //ここに double calcsum(); //抽象メソッド③があるとみなされる //ここに double calcaverage(); //抽象メソッド④があるとみなされる double calcmax(); //抽象メソッド⑤ } class MyClass : IInterface3 { //【変更】派生の派生インターフェイス③を実装するクラス double[] data; bool bOK = false; //OKフラグ(false:準備前) public void setdatano(int n) { //抽象メソッド①のオーバーライド data = new…
・p.259「1つのインターフェイスを複数のクラスで実装する」から 提出フォロー:アレンジ演習:p.257 interface01.cs ・IMyInterfaceインターフェイスを実装するYourClassを追加し、MainメソッドでMyClassと同様に扱えることを試そう 作成例 //アレンジ演習:p.257 interface01.cs using System; interface IMyInterface { //インターフェイスの定義 void show(string str); //抽象メソッド int xprop { get; set; } //抽象プロパティ int this[int i] { get; set; } //抽象インデクサ } class MyClass : IMyInterface { //インターフェイスを実装したクラス① int i; int[] arr = new int[10]; public void show(string str) { //抽象メソッドのオーバーライド① Console.WriteLine(str); } public int xprop { //抽象プロパティのオーバーライド① get { return i; } set { i = value; } } public int this[int index] { //抽象インデクサのオーバーライド① get { return arr[index]; } set { arr[index] = value; } } } class YourClass : IMyInterface { //【以下追加】インターフェイスを実装したクラス② ※上記と同一内容 int i; int[] arr = new int[10]; public void show(string str) { //抽象メソッドのオーバーライド②…
ゲームソフト販売本数ランキング:今週1位は再び「マリオカート ワールド(Switch2)」 GO! ガンホー、2Qは59%営業減益で正念場-アクティビストとの対立激化、社長の進退問う臨時総会へ【ゲーム企業の決算を読む】GO! 東京ゲームショウ 2025/TGS2025 最新ニュース GO! 同梱品目当ての“粗悪ゲー”がPSストアに氾濫? PS5でのアバター販売停止が生んだ新たな問題点 GO! 『トゥームレイダー』のリマスターで生成AIボイスが勝手に使われている!声優がメーカー提訴、この問題が起きた理由とは GO!
・クラス・メソッドの分割定義ですが、どういう時に行うのでしょうか。そして、最大何回分割できるのでしょうか。 クラスの定義内容が大きく、長いソースになる場合、 加えて、内容の更新が頻繁に起こるメソッドがある場合、クラス・メソッドの分割定義を検討します。 ソースを分けることにより、役割分担がしやすくなり、見通しが良くなることから、 可読性や保守性が向上します。 しかし、ソースの管理が煩雑になりますので(分割回数に制限はありませんが) 適切な回数にとどめておくと良いでしょう。 ・抽象メソッドは基本クラスで宣言をし、派生クラスで実装する必要があるとのことですが、つまりは基本クラスで宣言のみをしてもあまり意味がないという事でしょうか?もしくはそもそも実行できないのでしょうか? 抽象メソッドは「実行用」ではなく「定義用」です。 よって、抽象メソッドを含む抽象クラスは(インターフェイスも)インスタンスを生成できません。 抽象クラスは、主に、派生クラスが複数ある場合に、まとめて扱うための存在です。 そして、派生クラスごとに内容は異なるが、同じシグニチャのメソッドを、 抽象メソッドとして、基本クラス(抽象クラス)に記述しておくことで、 各クラスの整合性を保ち、利用しやすくします。 例えば、Monsterクラスを基本クラス(抽象クラス)として「自分の情報を表示する」Showメソッドを 持たせる場合、表示内容はモンスターの種類により異なるので、抽象メソッドにしておきます。 そして、Monsterクラスの派生クラスのSlimeクラスでShowメソッドを「HPを表示する」とし、 同じく、Monsterクラスの派生クラスのDragonクラスでShowメソッドを「HP,MPを表示する」として 記述します。 すると、SlimeクラスのインスタンスもDragonクラスのインスタンスも、 Monsterクラスのインスタンスとして扱うことができ、どちらもShowメソッドがあることが、 確定します。 このことを、各クラスを使う側から見ると 「Monsterクラスの派生クラスのオブジェクトには、必ずShowメソッドがあるから安心」 「まとめて扱える」というメリットになるわけです。 この例をプログラムにすると以下のようになります。 using System; abstract class Monster { //抽象クラスMonster protected int hp = 1; //モンスター共通のインスタンス変数の定義 public abstract void Show(); //抽象メソッド(内容は決められないメソッド) } class Slime : Monster { //Monsterの派生クラス① public override void Show() { //↑のオーバライド Console.WriteLine("HPは{0}", hp); } } class Dragon : Monster { //Monsterの派生クラス② int mp = 100; public override void Show() { //↑のオーバライド Console.WriteLine("HPは{0}、MPは{1}", hp, mp); } } class abstract01 { public static void Main() { Slime slalin = new Slime(); //Slimeクラスのオブジェクト「スラリン」を生成 Dragon veldra = new Dragon(); //Dragonクラスのオブジェクト「ヴェルドラ」を生成 Monster m1 = slalin, m2 = veldra; //上記をMonsterクラスのオブジェクトm1,m2として扱う…
次回(最終回)予告:p.259 1つのインターフェイスを複数のクラスで実装する 講義メモ:memo20250907.txt
p.255 インターフェイス ・元の意味は「接合部/面」で「異なる要素を関連付ける仕掛け」 ・C#では、継承関係にないクラスであっても、関連付けられる仕組み ・例えば、空中シューティングゲームで、飛んでいるドラゴンとF16戦闘機を「飛べるもの」インターフェイスで まとめて扱うことができる ・インターフェイスは文法では抽象クラスの拡張形式で「抽象メンバのみをもった参照型」となる ・書式: interface インターフェイス名 { 抽象メンバ … } ・インターフェイスに記述できる抽象メンバとしては、抽象メソッド、抽象プロパティ、抽象インデクサがある ※ (Javaとは異なり)データメンバは記述できない ・例: interface Flyable { string HowToFly(); } //「飛べるもの」インターフェイスに飛び方を返すメソッドがある ・なお、インターフェイスの中に記述した抽象メンバは「abstract」は不要 ・インターフェイスの中の抽象メソッドの書式: 戻り値型 メソッド名(引数型 引数,…); ・インターフェイスの中の抽象プロパティの書式: データ型 プロパティ名 { get; set; } ・インターフェイスの中の抽象インデクサの書式: データ型 this[インデックス型 インデックス名 { get; set; } p.256 インターフェイスの実装 ・クラスの継承と同じ形式で、インターフェイスの実装が可能 ・なお、クラスの継承と異なり、インターフェイスの実装は複数行って良い ・書式: class クラス名 : インターフェイス名,… {…} ・例: class F16 : Flyable {…} //F16戦闘機は「飛べるもの」 ・例: class Dragon : Flyable, Swimable {…} //ドラゴンは「飛べるもの」で「泳げるもの」 ・インターフェイスを実装したクラスでは、インターフェイスにある抽象メンバをオーバーライドする必要がある ・しかし、これは継承におけるオーバーライドとは区別され、override指定は不要で、通常、publicにする ・例: class F16 : Flyable { //F16戦闘機は「飛べるもの」 public string HowToFly() { return “エンジンで”; } } ・例: class Dragon : Flyable, Swimable { //ドラゴンは「飛べるもの」で「泳げるもの」 public string HowToFly() { return “自分の翼で”; } public string HowToSwim() { return “自分の尾で”; } }…
p.250 クラスを分割定義する ・1クラスを複数のソースリストで記述できる ・これにより、ソースの長大化を防いだり、チーム開発を効率化できる ・テキストではクラス定義を2分割して1ソースに置いているが、通常、ソースの分割に用いる ・クラスを分割定義するには、classの前に partial を付記する(これを部分クラスともいう) ・部分クラスのどこかで定義したメンバは、他のソースにある部分クラスからも利用可能 ・ビルドにより分割クラスは1つになり、1つの実行ファイルが生成される ・なお、クラスを分割定義している場合は、VisualStudioの「ファイル」「すべて保存」を用いて、一部ファイルの保存モレを防止すると良い アレンジ演習:p.250 partial01.cs ・018行目までをpartial01.csに、020行目以降をpartial01a.csに分離しよう ・なお、「using System;」は両方またはどちらか片方で必要に応じて配置すること ・1つのプロジェクトにpartial01.csファイルがある状態で、そこに、ソースファイルを追加すれば良い 作成例:partial01.cs(分割元) //アレンジ演習: partial01.cs using System; partial class MyClass { //部分クラス MyClassクラス① public int x; } class partial01 { //通常クラス public static void Main() { MyClass mc = new MyClass(); //部分クラスを結合した状態で扱う mc.x = 10; mc.Show(); } } 作成例:partial01.cs(分割先) //アレンジ演習: partial01a.cs using System; //こちらにも必要(自動生成されることもある) partial class MyClass { //部分クラス MyClassクラス② public void Show() { Console.WriteLine("x = {0}", x); } } p.251 メソッドを分割定義する ・分割したクラスにおいて、メソッドの宣言と定義を別々の部分クラスに記述できる ・これを部分メソッドといい、メソッドの冒頭に「partial」を指定する ・ただし、戻り値型がvoidで、privateなメソッドに限る ・部分メソッド宣言の書式: partial void メソッド名(引数型 引数名, …); ・部分メソッド定義の書式: partial void メソッド名(引数型 引数名, …){…} ※ この仕掛けは未完成のメソッドがある場合に便利で、 シグニチャだけを部分メソッドとして記述しておくと良い ※ 1メソッドを複数ソースファイルで分割記述できるわけではない アレンジ演習:p.251 partialmethod01.cs ・020行目までをpartialmethod01.csに、021行目以降をpartialmethod01a.csに分離しよう ・なお、「using System;」は両方またはどちらか片方で必要に応じて配置すること ・1つのプロジェクトにpartialmethod01a.csファイルがある状態で、そこに、ソースファイルを追加すれば良い 作成例:partialmethod01.cs(分割元) // partialmethod01.cs using System; partial class…
提出フォロー:アレンジ演習:p.240 inheritance05.cs ・派生クラスのオーバーライドメソッドを、そのまま、派生の派生クラスでオーバーライドできることを確認しよう ・Derived2クラスを継承するDerived3クラスを定義して、Show()メソッドをオーバーライドし、Main()で呼び出てみよう 作成例 //アレンジ演習:p.240 inheritance05.cs using System; class MyBase { //基本クラス protected int x = 10; //継承可能なインスタンス変数 public virtual void show() { //仮想メソッド Console.WriteLine("x = {0}", x); } } class Derived1 : MyBase { //派生クラス // ここに「protected int x = 10; //継承可能なインスタンス変数」が継承される protected int y = 20; //継承可能なインスタンス変数 // ここに「public virtual void show() … //仮想メソッド」が継承される } class Derived2 : Derived1 { //派生の派生クラス // ここに「protected int x = 10; //継承可能なインスタンス変数」が継承される // ここに「protected int y = 20; //継承可能なインスタンス変数」が継承される int z = 30; //継承されないインスタンス変数 // ここに「public virtual void show() … //仮想メソッド」が継承されるがオーバライドされる public override void show() { //オーバライドメソッド Console.WriteLine("z = {0}", z); } } class Derived3 : Derived2 { //【以下追加】派生の派生の派生クラス // ここに「protected…
ゲームソフト販売本数ランキング:今週1位は「METAL GEAR SOLID Δ: SNAKE EATER(PS5)」 GO! 『ブルアカ』『メイプルストーリー』減衰…ネクソンの日本事業は上期25%の減収で折り返し【ゲーム企業の決算を読む】GO! プロが教える動画制作、中高生向け無料オンライン講座9-10月 GO! 【キャリアクエスト】FGOだけじゃない、ラセングルならではの挑戦を求めて。“若い会社”で活躍する、とあるゼネラリストの働き方事情 GO! インディーゲームの祭典「INDIE Live Expo」開催日は11月29日に決定、100作品以上の紹介やアワードを予定 GO! Roblox、ユーザーに対しての「年齢確認」取り組み強化へ―未成年と大人のコミュニケーションを大きく制限する機能も追加予定 GO! R-18コンテンツを開いているブラウザタブを検知・スクショするマルウェア Webカムで撮影も 性的脅迫に使用か GO! App Storeの審査が突如通らず──DMM傘下のスマホゲームでトラブル 「リリースから実装済みの全イラストが修正対象に」GO! 「みんなのGOLF」新作、発売日に異例声明 ユーザーからの“不具合報告”続出で 「現象の原因究明に努める」GO!