p.153 クラスと何か
・C#などのオブジェクト指向言語では、プログラムをクラスを単位として作成し、データ構造もクラスを基本として扱うことができる ※ C++のように、プログラムの一部をクラスを単位として作成するものもある ・プログラムはビルドして実行を指示することにより、記述内容に従った実体がメモリ上に生成されて動作する ・つまり、プログラム=クラスは設計図にあたり、動作する実体をオブジェクトという ・この考え方を、クラスの中で用いるデータ構造や部品に当てはめることもできる ・つまり、プログラムにおいて、他のクラスの実体を生成して用いることが、プログラムの部品化にあたる ・なお、クラスから生成したオブジェクトをインスタンスともいう
p.154 簡単なクラスを定義しよう
・最も簡単なクラスは変数のみを持つクラスで、複数の変数を持つクラスにより、C/C++でいう構造体に類似するデータ構造を表現できる
・書式: class クラス名 { アクセス修飾子 型 変数名; … }
・アクセス修飾子は主にpublicとprivateで、外部から直接アクセスを許す場合はpublicと明示する。
内部用の場合は無指定にするか、privateと明示する
・例: class Monster { public string name; public int hp; public int mp; } //名前とHP,MPを持つ怪物
・クラスを型として変数を宣言することで、クラスから生成したインスタンスを扱うことができる
・生成には配列と同様にnew演算子を用いる
・宣言の書式: クラス名 インスタンス名;
・生成の書式: インスタンス名 = new クラス名();
・宣言と生成は同時に行うことが可能。書式: クラス名 インスタンス名 = new クラス名();
例: Monster veldra = new Monster(); //怪物クラスから実体としてveldraを生成
・複数のインスタンスをまとめて生成できる
例: Monster veldra = new Monster(), rimuru = new Monster(); //怪物クラスから実体としてveldraとrimuruを生成
・クラスで定義した変数は、インスタンスごとに用意されるので、インスタンス名.変数名 でアクセスできる
・クラスの中で定義したものをメンバといい、インスタンスの中の変数をインスタンス変数という
例: veldra.name = "ヴェルドラ"; veldra.hp = 100; rimuru.mp = 500;
※「.」はドット演算子ともいい、日本語の「の」に近い
・この仕組を用いるだけでも、変数のグループ化やデータの扱いの可視化が容易になる
p.156 simpleclass.cs
//p.156 simpleclass.cs
using System;
class myclass //クラスを定義(インスタンス変数を1個もつ部品的なクラス)
{
public int x; //外部からアクセス可能なインスタンス変数
}
class simpleclass //実行用のMainメソッドを持つクラス
{
public static void Main()
{
myclass mc = new myclass(); //部品的なクラスのインスタンスを生成
mc.x = 10; //インスタンス名.メンバ名でインスタンス変数に数値を代入
Console.WriteLine("mc.x = {0}", mc.x); //インスタンス名.メンバ名でインスタンス変数の値を表示
}
}
アレンジ演習:p.156 simpleclass.cs
・上記の例から以下を試そう:
class Monster { public string name; public int hp; public int mp; } //名前とHP,MPを持つ怪物
Monster veldra = new Monster(); //怪物クラスから実体としてveldraを生成
veldra.name = "ヴェルドラ"; veldra.hp = 100;
・適当な表示処理を追加すること
作成例
//アレンジ演習:p.156 simpleclass.cs
using System;
class Monster //クラスを定義(インスタンス変数を3個もつ部品的なクラス)
{
public string name; //外部からアクセス可能なインスタンス変数
public int hp; //外部からアクセス可能なインスタンス変数
public int mp; //外部からアクセス可能なインスタンス変数
}
class simpleclass //実行用のMainメソッドを持つクラス
{
public static void Main()
{
Monster veldra = new Monster(); //部品的なクラスのインスタンスを生成
veldra.name = "ヴェルドラ"; //インスタンス名.メンバ名でインスタンス変数に値(文字列)を代入
veldra.hp = 100; //インスタンス名.メンバ名でインスタンス変数に数値を代入
//インスタンス名.メンバ名でインスタンス変数の値を表示(mpは初期値の0)
Console.WriteLine("name = {0} hp = {1} mp = {2}", veldra.name, veldra.hp, veldra.mp);
}
}
p.157(複数のインスタンスを生成)
・メンバであるインスタンス変数は、インスタンスごとに存在する。よって、異なる変数として扱える 例: Monster veldra = new Monster(), rimuru = new Monster(); //怪物クラスから実体としてveldraとrimuruを生成 veldra.name = "ヴェルドラ"; veldra.hp = 100; veldra.mp = 500; rimuru.name = "魔王リムル"; rimuru.hp = 900; rimuru.mp = 800;
p.157 simpleclass02.cs
//p.157 simpleclass02.cs
using System;
class MyClass //クラスを定義(インスタンス変数を1個もつ部品的なクラス)
{
public int x; //外部からアクセス可能なインスタンス変数
}
class simpleclass02
{
public static void Main()
{
MyClass a, b; //部品的なクラスを型とするオブジェクト名を2つ宣言
a = new MyClass(); //部品的なクラスのインスタンスを生成してオブジェクト名aで扱う
b = new MyClass(); //部品的なクラスの別のインスタンスを生成してオブジェクト名bで扱う
a.x = 10; //aに含まれるインスタンス変数xに代入
b.x = 100; //bに含まれるインスタンス変数xに代入(↑とは別のもの)
Console.WriteLine("a.x = {0}, b.x = {1}", a.x, b.x); //別のものなので10,100となる
}
}
アレンジ演習:p.157 simpleclass02.cs
・上記の例から以下を試そう:
class Monster { public string name; public int hp; public int mp; } //名前とHP,MPを持つ怪物
Monster veldra = new Monster(), rimuru = new Monster(); //怪物クラスから実体としてveldraとrimuruを生成
veldra.name = "ヴェルドラ"; veldra.hp = 100; veldra.mp = 500;
rimuru.name = "魔王リムル"; rimuru.hp = 900; rimuru.mp = 800;
・適当な表示処理を追加すること
作成例
//アレンジ演習:p.157 simpleclass02.cs
using System;
class Monster //クラスを定義(インスタンス変数を3個もつ部品的なクラス)
{
public string name; //外部からアクセス可能なインスタンス変数
public int hp; //外部からアクセス可能なインスタンス変数
public int mp; //外部からアクセス可能なインスタンス変数
}
class simpleclass //実行用のMainメソッドを持つクラス
{
public static void Main()
{
Monster veldra = new Monster(), rimuru = new Monster(); //部品的なクラスのインスタンスを2つ生成
//インスタンス名.メンバ名でインスタンス変数に値(文字列、整数)を代入
veldra.name = "ヴェルドラ"; veldra.hp = 100; veldra.mp = 500;
rimuru.name = "魔王リムル"; rimuru.hp = 900; rimuru.mp = 800;
//インスタンス名.メンバ名でインスタンス変数の値を表示
Console.WriteLine("name = {0} hp = {1} mp = {2}", veldra.name, veldra.hp, veldra.mp);
Console.WriteLine("name = {0} hp = {1} mp = {2}", rimuru.name, rimuru.hp, rimuru.mp);
}
}
p.158(クラス型の変数の特性)
・クラスを型とする変数は参照型(p.40)となり、変数が持つのは参照(実体の位置情報)となる ・よって、初期化や生成により、変数にインスタンスの参照が与えられる ・そして、クラスを型とする変数どうしの代入を行うと、参照がコピーされる ・この結果、2つの変数が同じインスタンスを参照するようになる (2つ目の変数が別名と同じ働きをするようになる) 例: Monster rimuru = new Monster(); //インスタンスの生成 Monster maou = rimuru; //インスタンスの参照をコピー(maouがrimuruの別名になる) rimuru.hp = 10; Console.WriteLine(maou.hp); //10が表示される
p.158 simpleclass03.cs
//p.158 simpleclass03.cs
using System;
class MyClass //クラスを定義(インスタンス変数を1個もつ部品的なクラス)
{
public int x; //外部からアクセス可能なインスタンス変数
}
class simpleclass03
{
public static void Main()
{
MyClass a, b; //部品的なクラスを型とするオブジェクト名を2つ宣言
a = new MyClass(); //部品的なクラスのインスタンスを生成してオブジェクト名aで扱う
a.x = 10; //aに含まれるインスタンス変数xに代入
b = a; //aが持つ参照をbにコピー(bはaと同じインスタンスを指すようになる)
Console.WriteLine("b.x = {0}", b.x); //よってb経由でxの値が得られる
b.x = 100; //b経由でxの値を変更でkる
Console.WriteLine("a.x = {0}", a.x); //よってa経由でxの値を見ると変更されている
}
}
提出:アレンジ演習:p.157 simpleclass02.cs