クラス -クラスの基本-

ホームC#プログラミング応用講義 > クラスの基本

目次

定義

クラスは C# における基本単位です。クラスは
class
キーワードによって宣言されるのは基本です。
class ClassName
{
アクセス修飾子 型 変数名1;
アクセス修飾子 型 変数名2;
アクセス修飾子 型 変数名n;

:
:

アクセス修飾子 戻り値の型 メソッド名1()
{
:
:
]

アクセス修飾子 戻り値の型 メソッド名2()
{
:
:
]

アクセス修飾子 戻り値の型 メソッド名n()
{
:
:
]
}
これが基本的なクラスです。クラスには変数メソッドをそれぞれ用意するの が普通で、これらをクラスのメンバと呼ばれます。(メンバにはプロパティも含 まれます)

これらの変数やメソッドはまったく無関係のものでは意味がありません。ある目的に必要な変数とメソッドをすべて含みます。余分なものを入れたり、また足り なかったりしてはいけません。

class ClassName
{
public ClassName()
{
:
:
}
}
メソッド名がクラスメイト同じものは「コンストラクタ」として扱われます。コ ンストラクタはクラスからオブジェクトを生成する際に
new ClassName()
とするように、オブジェクト生成時に必ず呼び出されます。

コンストラクタは必ずしも指定する必要はありません。もし定義されていないならデフォルトコンストラクタが呼び出されます。
これは何の働きもしないコンストラクタです。

コンストラクタは通常、引数をとり、値を受け取るために使われる場合が多いです。
using System;

class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine("半径を入力してください : ");
double d = double.Parse(Console.ReadLine());
Circle cir = new Circle(d);
cir.Show();
}
}

class Circle
{
double r;
const double pi = 3.14;

public Circle(double d)
{
r = d;
}

public void Show()
{
double s = r*r*pi;
Console.WriteLine("半径{0}の円の面積は{1}です",r,s);
}
}
円の面積を求めるのは
半径 × 半径 × 3.14
というのは知っていると思います。ここでは指定された半径の円の面積を求めるクラスを作っています。

MainClass クラスでは一切の計算をしていません。計算結果を表示することもせず、すべては Circle クラスにまとめられ、それを呼び出しているだけです。
このプログラムならコンストラクタを利用しなくとも作ることができますが、コンストラクタになれるために使っています。

ここでは Show() を public にしていますが、コンストラクタから
Show();
として呼び出せば private で利用できます。しかし、このようにすると
Main() → Circle() コンストラクタ → Show()
とプログラムの制御が見えないところで移ってしまい、スパゲッティコードになりかねません。 よって、
Main()
    + ---→ Circle() コンストラクタ
    |
    + ---→  Show()
と呼び出しをわかりやすくすべきです。

クラスは「円の面積の計算」という点で独立し、オブジェクトを作り出す設計図になっています。ここでは Circle 設計図から cir オブジェクトを生成していることになります。

また、コンストラクタですべての処理をすることもできますが、コンストラクタには複雑な処理を与えるべきではありません。それぞれの動作、ここでは計算に なりますが、それは独立させてメソッドを構成することでクラスとしてまとまることができます。

分散

円の面積の計算というレベルのプログラムなら、何もわざわざクラスをもう一つ作る必要はないように思われます。
しかし、オブジェクト指向はこのような簡単なプログラムの中でも有効利用することができます。

例えば、円の面積のほかに長方形の面積を計算することにしましょう。もしそれを Main() メソッドだけで処理しようとすれば、その中は
初期処理(入力・判別)・円の面積計算・長方形の面積計算
この3つの働きをすることになります。

これは非常に複雑になります。すべてが Main() にまとまっており、オブジェクトを生成する必要もないので簡単に見えますが、このようにばらばらな 働きをするものが1つにまとまっていると大変わかりずらくなります。いわゆる「スパゲティコード」 の発生です。(スパゲティコードの最大の原因は go-to などの簡易なジャンプと条件分岐の乱用です)

オブジェクトはそれ独立で円を構成すると前に図で説明しました。

関係図

スッキリの方は丸がたくさんあり、扱いにくそうですがそれぞれが独立しているため、実際に組んでいくのは1つ1つの丸であり、全体を捉えや すくなります。

一方、デコボコのほうが一見まとまっているように見えてそれぞれが独立していません。そのためそれぞれがばらばらになってしまい、まとまり がなくなります。
これがオブジェクト指向の失敗の典型的なパターンです。

長方形三角形台形と計算したいものが増えていくと、始めの分岐だけで Main() は複雑になってしまいます。
そのうえデコボコのように別のものを MainClass クラスにくっつけていくと複雑極まりなくなります。

ただし、これは大きなクラスを作るなというのではありません。たとえ大きくなっても、1つのクラスに定義するほうがいい場合は1つのクラスにまとめなけれ ばなりません。
スッキリ側の失敗はむやみやたらにオブジェクトを作り、それぞれが独立できない状態になることです。

それぞれが独立できないならば、横断要素が発生します。これは A と B というオブジェクト両方にまたがる処理です。
この横断要素を作ってしまうと、バグが発見されたときに対処が難しくなります。関連するすべてのクラスに処理を施さねばなりません。

このようにいろいろな処理を分散させたり統合させたり、それをうまく駆使することで大きな利益が得られるのがオブジェクト指向です。
オブジェクト指向を駆使すれば巨大なプログラムでもスムーズに管理することが可能になります。

始めはこのオブジェクト指向の感覚は非常に難しいものです。ここで紹介した円・長方形・三角形・台形の面積を求めるプログラムは私がオブジェクト指向を学 ぶために作ってみたプログラムの1つです。
ちょっと違いますが、「百聞は一見にしかず」「論よりソース」ですので、他の図形に関しては自分で作ってみましょう。いろいろなクラスがま とまった初めてのプロジェクトはなぜか妙に感動してしまうものです。

[ ステップアップC# ] [ C#プログラミング応用講義 ]