この記事ではクラス内にメソッドを追加する方法を解説していきます。クラスにメソッドを追加する際には、アクセス修飾子が指定できるので、それも併せて確認していきます。サンプルアプリを2つほど作成したいと考えていますので、しっかりと学んでいただければと思います。
メソッドを追加するには
クラス内にメソッドを追加する方法を紹介したいと思います。最初のうちはメソッドの定義の仕方をド忘れしてしまうこともあるかもしれませんが、そういうのは繰り返し手を動かして覚えていくしかありません。一発で覚える必要はありませんが、繰り返し復習したりして体に染み込ませていってください。
今回はクラスに大してメソッドを追加していきます。クラスは「設計図」という話を何度もしていますが、オブジェクトの設計図に対して、「振る舞い・所作」を加えていくのがメソッドを定義する真の意味合いになります。
さらに、アクセス修飾子でも学んでいますが、メソッドにもpublicやprivateを指定することが可能です。publicを指定すれば、クラスの外側からでも、その「振る舞い」を実行することができますし、privateを指定した場合は、クラスの中からしか呼び出せない「振る舞い」を記述できます。
クラスの外から呼び出す際は「(インスタンス変数名).(メソッド名)」で呼び出すことができます。クラス内から呼び出す場合はこれまで通りの呼び出し方で問題ありません。
クラスにメソッドを追加する方法
それではクラスにメソッドを追加する方法を解説したいと思います。今回は「所作・振る舞い」ということで、車(Car)クラスを作成してみました。Carクラスに対して、アクセルとブレーキの処理を疑似的に実装しています。
publicメソッドを追加する方法
それではクラスにメソッドを追加する方法を解説していきます。新規のコンソールアプリケーションを作成してアプリケーションを作成していきましょう。今回はpublicメソッドに焦点を絞って解説していきます。
using System;
namespace App08
{
class Program
{
static void Main(string[] args)
{
//メルセデスベンツ(仮)をインスタンス化する
Car MyMercedes = new Car();
//アクセルを踏む
MyMercedes.Go();
//ブレーキを踏む
MyMercedes.Brake();
Console.ReadLine();
}
//車クラス
public class Car
{
public Car() { }
//アクセルを踏む
public void Go()
{
Console.WriteLine("進みます。");
}
//ブレーキを踏む
public void Brake()
{
Console.WriteLine("止まります。");
}
}
}
}
まずはCarクラスだけを見てみましょう。特に難しいことは行っておらず、単純なクラスを追加してメソッドを追加しています。ここではpublicのメソッドだけを実装しています。
//車クラス
public class Car
{
public Car() { }
//アクセルを踏む
public void Go()
{
Console.WriteLine("進みます。");
}
//ブレーキを踏む
public void Brake()
{
Console.WriteLine("止まります。");
}
}
クラスを定義する際は「(アクセス修飾子) class (クラス名)」を記述する必要があります。そして「public Car() { }」はコンストラクタです。今回は初期化の処理などは記述していません。
//アクセルを踏む
public void Go()
{
Console.WriteLine("進みます。");
}
//ブレーキを踏む
public void Brake()
{
Console.WriteLine("止まります。");
}
上記の部分がメソッドの箇所ですね。アクセルを踏んだと気の所作を定義する「Go」メソッドと、ブレーキを踏んだ時の所作を定義する「brake」メソッドを追加しています。処理内容はコンソール画面に文字を出力するだけですが。
「クラス」という設計図に処理を記述することで、ここから生み出されるオブジェクトにも、クラス内に記述した所作が定義されるようになります。以下はインスタンスを行っている箇所です。
//メルセデスベンツ(仮)をインスタンス化する
Car MyMercedes = new Car();
MyMercedesというインスタンス変数を設定して、Carクラスからオブジェクトを生成しました。Carクラスのオブジェクトである「MyMercedes」は、Carクラスの所作・振る舞いを持っています。
//アクセルを踏む
MyMercedes.Go();
//ブレーキを踏む
MyMercedes.Brake();
したがって上記のように、アクセルとブレーキの処理を行うことができます。その場合は「(インスタンス変数名)(メソッド名)」の形式でメソッドを実行することができます。
Privateメソッドを追加する方法
publicメソッドをクラスに追加する方法については紹介したので、今度はprivateのアクセス修飾子を持つメソッドをクラスに追加する方法を解説していきます。
追加の仕方は基本的にpublicメソッドの時と変わりませんが、変数の時と同様にクラスの外側からメソッドを実行することはできません。privateなメソッドは定義されたクラス内からの呼び出しにしか対応することはありません。
では、早速、新規のコンソールアプリケーションを作成して、以下のコードを記述してみましょう。
using System;
namespace App09
{
class Program
{
static void Main(string[] args)
{
Sample sample = new Sample();
sample.WriteMessage("Taro");
//sample.GetMessage("Taro"); とはできない。
Console.ReadLine();
}
//サンプルクラス
public class Sample
{
//publicメソッド
public void WriteMessage(string name)
{
string message = GetMessage(name);
Console.WriteLine(message);
}
//privateメソッド
private string GetMessage(string name)
{
return $"Hello, {name}";
}
}
}
}
コンソール画面に引数で渡した名前を使ったメッセージを表示するクラスを作成してみました。メッセージを取得する処理はprivateで定義しています。したがってコメントアウトしている以下の処理は記述できません。
sample.GetMessage("Taro");
GetMessageメソッドはprivateメソッドであるためですね。しかしながら、WriteMessageメソッド内からは「GetMessage」メソッドを呼ぶことはできます。
//publicメソッド
public void WriteMessage(string name)
{
string message = GetMessage(name);
Console.WriteLine(message);
}
これがpublicメソッドとprivateメソッドの違いになります。こうなると「すべてのメソッドをpublicにしちゃダメなの?」と思うかもしれませんが、基本的に「すべてはダメ」です。publicメソッドにするのは「できる限り少なくする」のがお作法だと覚えておきましょう。
慣れないうちはpublicでメソッドを宣言しとくのも良いですが、できる限りはじめから「publicメソッドは少なくする」ような癖を付けておいたほうがいいです。これは「実装の隠蔽」という、もう少し後になって学習する内容で説明します。
クラスにメソッドを追加しよう
以上、ここではpublicメソッドとprivateメソッドをクラスに定義して、それらを使用する方法をサンプルコードを使って解説してきました。メソッドを追加するには、通常のメソッドの記述をクラス内に行っていくだけです。
クラスにメソッドを記述すると、その「振る舞い」は、クラスを基に生成されたオブジェクトにも反映されます。またその際には、publicとprivateをアクセス修飾子を決めて記述できます。publicメソッドはクラスの外側からでも呼び出すことができ、privateメソッドはクラスの内部からしか呼び出すことができません。
要するに定義するメソッドにも「外部公開がOK」な処理と「外部公開がNG」な処理を定義できるということです。どうしてそれらが定義できるか、という話は別の機会に行いたいと思います。