【C#入門】カプセル化(コンストラクター、thisワード)について分かりやすいサンプルコードで徹底解説②
「カプセル化」の続きです。
今回はコンストラクター、thisワードについて紹介します。
コンストラクター
カプセル化は実装できましたが、インスタンスを生成した直後にPowerとVolumnに値を設定する方法がなくなってしまいました。
このようなときに利用するのが、「コンストラクター」と呼ばれるクラスの初期化メソッドです。
コンストラクターは ルドやプロバティのインスタンスの生成時に一度だけ呼び出され、フィールドやプロパティの初期化などを行います。
• コンストラクターの定義
1 2 3 4 |
アクセス修飾子 クラス名(引数1,引数2...) { 処理 } |
コンストラクターの記述には次のような特徴があります。
● コンストラクター名はクラス名と同じにする
● 戻り値はない(voidは書かない)
● アクセス修飾子は通常「public」にする
コンストラクターは、クラスからインスタンスをnew演算子で生成するときに 呼び出されます。
• コンストラクターの呼び出し
1 |
クラス名 変数名 = new クラス名(引数1, 引数2,...); |
実は、これまで説明に用いてきたTalevisionクラスのように、コンストラクター
を記述しない場合でも、インスタンスを生成する際に、コンパイラが何も行わない引数なしのデフォルトのコンストラクターを呼び出していたのです。
では、Televisionクラスにコンストラクターを追加します。コンストラクターにもメソッドのオーバーロードを適用することができるので、 今回は3種類のコンストラクターを記述することにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
class Television { private int channel; // 現在のチャンネル private const int ChannelMin = 1; // チャンネル下限 private const int ChannelMax = 12; // チャンネル上限 private const int VolumeMin = 0; // 音量下限 private const int VolumeMax = 40; // 音量上限 // コンストラクター public Television() { Console.WriteLine("引数のないコンストラクターの呼び出し"); Power = false; Channel = 1; Volume = 20; } public Television(int channel, int volume) { Console.WriteLine("引数が2個のコンストラクターの呼び出し"); Power = false; Channel = channel; Volume = volume; } public Television (bool power, int channel, int volume) { Console.WriteLine("引数が3個のコンストラクターの呼び出し"); Power = power; Channel = channel; Volume = volume; } |
メインメソッドも以下のように書き換えます。インスタンスを2個生成し、それぞれ引数の違うコンストラクターを呼び出しています。なお、コード中の「?;」は「条件演算子」です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
static void Main(string[] args) { Television tv= new Television (): Console.WriteLine($"TV1 電源: {(tv.Power ? "ON" : "OFF") } " + . $"チャンネル:{tv.channel} 音量:{tv.Volume}"); Console.WriteLine("チャンネルを+2します。"); tv.ChannelUP(); tv.ChannelUP(); Console.WriteLine($"TV1は{tv.channel}チャンネルです。"); Console.WriteLine("音量を-2します。"); tv.VolumeDown(); tv.VolumeDown(); Console.WriteLine($"TV1の音量は{tv.Volume}です。"); Television tv2 = new Television (8, 25); Console.WriteLine($"TV2 電源:{(tv2.Power ? "ON" : "OFF")} " + $"チャンネル:{tv2.Channel} 音量:{tv2.Volume}"); Console.WriteLine("チャンネルを+2します。"); tv2.ChannelUP(); tv2.ChannelUP(); Console.WriteLine($"TV2は{tv2.Channel}チャンネルです。") Console.WriteLine("音量を-2します。"); tv2.Volume Down (); tv2.VolumeDown(); Console.WriteLine($"TV2の音量は{tv2.Volume} } |
コンストラクター後の実行結果
thisキーワード
thisキーワード」は、クラスの現在のインスタンスを参照するもので、 自身のメンバーを参照する場合などに使用されます。
● フィールド名と引数名が同じ場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class Class1 { private string name; // フィールド public Class1(string name) { this.name = name; // this.name : Class1フィールドのname // name : 引数のname } } <p class="blog_p">● 自分自身のメソッドを明示的に呼び出す場合</p> <pre class="lang:default decode:true "> public partial class Form1 : Form { public Form1() { InitializeComponent(); // ボタンをクリックするとフォームを閉じる private void Button1_Click(object sender, EventArgs e) { this.Close(); // FormlのCloseメソッドの呼び出し } } |
● 自分自身のコンストラクターに引数を渡す場合
1 2 3 4 5 6 7 8 9 10 11 12 |
class Class2 { public string name; public Class2(string n) { name = n; } public Class2() : this("匿名"){ } // 引数が1個のコンストラクターを呼び出し、引数を渡す } |

Soshi
株式会社flyhawkのSoshiです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。
