・p.155 簡単なクラスを定義しよう(データメンバの利用)から
p.154 簡単なクラスを定義しよう【再掲載】
・クラスにはデータや実行用のメソッドなどを含むことができる
・ここまで作成したプログラムにおいては、1クラスの中にmainという1つのメソッドが含まれている
・クラスに含まれるデータや実行用のメソッドなどをメンバという
・今まで定義してきた変数はすべてmainメソッドの中だったが、mainメソッドの外に定義することで、変数をクラスのメンバ(データメンバ)に
することができる
・これをクラス変数といい、メソッドとは独立して扱うことができる
・定義書式: アクセス修飾子 データ型 変数名;
・アクセス修飾子はメンバをクラスの外部から利用可能にするかどうか等を指定するもので、publicにすると、外部から利用可能
・mainメソッドがpublic指定なのは、C#システムから呼び出し可能にするため
・外部から利用可能にする必要がなければ、privateとすることで、クラス内でのみ利用可能にでき、安全性が高くなる
・クラスの定義書式: class クラス名 { メンバの定義; … }
・クラスのメンバはクラス変数のみでも良いので、複数の型が異なる変数をまとめて扱う場合にも有効
※ C言語における構造体をより強力に実装できる
・クラス変数のみのクラスの例
class Monster { //モンスタークラス(名前とHPとMPをデータメンバとして持つ)
public string name;
public int hp;
public int mp;
}
p.155 簡単なクラスを定義しよう(クラスからのオブジェクトの生成)【リライト】
・クラス変数のうち、インスタンスに属するものをインスタンス変数といい、特例を除き、クラス変数はインスタンス変数にする ・クラスの定義のみでは、基本的に設計図にすぎないので、記述したインスタンス変数の実体はない ・クラスからオブジェクト(インスタンス)を生成することにより、インスタンス変数の実体が用意される ・クラスからオブジェクト(インスタンス)を生成して扱うには、オブジェクトを識別する名前が必要で、これをオブジェクト名または インスタンス名という ・オブジェクト名は、クラスを型とする変数の扱いになる 例: Monster slarin; //モンスタークラスを型とするオブジェクトslarinの宣言 ・そして、クラスからオブジェクト(インスタンス)を生成するにはnew演算子を用い、生成したオブジェクトをオブジェクト名の変数に代入する 形式になる ・書式: オブジェクト名 = new クラス名(…); //クラスからオブジェクトを生成しオブジェクト名で利用可能にする 例: slarin = new Monster(); //モンスタークラスのオブジェクトを生成し、オブジェクト名slarinで利用可能にする ・変数の初期化と同様に、オブジェクト名の宣言とオブジェクトの生成は同時に行える ・書式: クラス名 オブジェクト名 = new クラス名(…); //クラスからオブジェクトを生成しオブジェクト名で利用可能にする
p.155 簡単なクラスを定義しよう(データメンバの利用)
・これにより、インスタンス変数の実体が生成され「オブジェクト名.インスタンス変数名」で利用可能になる 例: slarin.name = "スラリン"; slarin.hp = 5; slarin.mp = 10; ・このドットは「の」のイメージで、ドット演算子ともいう
アレンジ演習:p.156 simpleclass.cs
・インスタンス変数としてdouble型のyを追加し、Mainメソッドにyを扱う処理を追記しよう
作成例
//アレンジ演習:p.156 simpleclass.cs
using System;
class myclass //プログラマによる自前のクラスの定義
{
public int x; //メンバ:インスタンス変数
public double y; //【追加】メンバ:インスタンス変数
}
class simpleclass //実行用クラス(Main()メソッドを持つ)
{
public static void Main()
{
myclass mc = new myclass(); //自前のクラスのオブジェクトを生成しインスタンス名mcで利用可能に
mc.x = 10; //インスタンス名.インスタンス変数を用いて、値を代入
Console.WriteLine("mc.x = {0}", mc.x); //インスタンス名.インスタンス変数を用いて、値を表示
//【以下追加】
mc.y = 3.14; //インスタンス名.インスタンス変数を用いて、値を代入
Console.WriteLine("mc.y = {0}", mc.y); //インスタンス名.インスタンス変数を用いて、値を表示
}
}
p.157 簡単なクラスを定義しよう(インスタンス変数の複数定義・生成)
・「int x, y;」というように、同じ型の変数をまとめて宣言できる ・インスタンス名も同様で「クラス名 インスタンス名①, インスタンス名②, …」と記述できる ・なお、インスタンスの生成もまとめて行える(「int x = 1, y = 2;」と同様に) ・書式例: クラス名 インスタンス名① = new クラス名(), インスタンス名② = new クラス名(), …;
アレンジ演習:p.157 simpleclass02.cs
・014行目~016行目の内容を1文にしよう
作成例
//アレンジ演習:p.157 simpleclass02.cs
using System;
class MyClass //プログラマによる自前のクラスの定義
{
public int x; //メンバ:インスタンス変数
}
class simpleclass02 //実行用クラス(Main()メソッドを持つ)
{
public static void Main()
{
MyClass a = new MyClass(), b = new MyClass(); //【変更】インスタンスを2つ生成
a.x = 10; //インスタンスaのデータメンバxに代入
b.x = 100; //インスタンスbのデータメンバxに代入(↑とは別物)
Console.WriteLine("a.x = {0}, b.x = {1}", a.x, b.x); //異なる値になっている
}
}
参考:クラス図とオブジェクト図
・オブジェクト指向において各種の図解を行う図の標準化が行われており、UML(ユニファイド(統合された)モデリングランゲージ)という ・UMLに含まれる図として、クラス図とオブジェクト図がある ・作成には、 https://www.drawio.com/ が便利 ・クラス図とオブジェクト図
p.158 simpleclass03.cs 解説
・MyClassクラス、そのインスタンス、オブジェクト名aとbの関係を図示すると下記のようになる
アレンジ演習:p.158 simpleclass03.cs
・末尾において、新たにMyClassクラスのインスタンスを生成してオブジェクト名bで扱うようにしよう ・そして、b.xに1000を代入すると、a.xはどうなるか確認しよう
作成例
//アレンジ演習:p.158 simpleclass03.cs
using System;
class MyClass //プログラマによる自前のクラスの定義
{
public int x; //メンバ:インスタンス変数
}
class simpleclass03 //実行用クラス(Main()メソッドを持つ)
{
public static void Main()
{
MyClass a, b; //オブジェクト名を2つ宣言
a = new MyClass(); //インスタンスを生成し、オブジェクト名aで参照する
a.x = 10; //インスタンスaのデータメンバxに代入
b = a; //インスタンスaをオブジェクト名bで参照する(aとbは同じインスタンスを参照する)
Console.WriteLine("b.x = {0}", b.x); //10になる
b.x = 100; //インスタンスbのデータメンバxに代入
Console.WriteLine("a.x = {0}", a.x); //同じインスタンスを参照しているので100になる
//【以下追加】
b = new MyClass(); //インスタンスを生成し、オブジェクト名bで参照する(aとbは違う参照になる)
b.x = 1000; //インスタンスbのデータメンバxに代入
Console.WriteLine("a.x = {0}", a.x); //同じインスタンスを参照していないので100のままになる
}
}
解説図

p.158 簡単なクラスを定義しよう(実行用クラスとインスタンス変数)
・Main()メソッドを持つ実行用クラスに、インスタンス変数を持つことが可能 ・これは、クラスのテスト用や利用方法の説明用にMain()メソッドを付け加える場合を除いて、推奨されない (よって、simpleclass04.csは割愛) ・なお、Main()メソッドから直接、インスタンス変数にアクセスすることはできず、オブジェクトを生成する必要がある ・この理由は、p.202「静的メソッド」にて。

