講義メモ:第7章 クラスの基礎

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です