
【protectedなどの使い方】C#のアクセス修飾子を解説その2
前回の【internalの使い方】C#のアクセス修飾子を解説その1では、主にinternal修飾子について解説してきました。次はprotected修飾子など他のアクセス修飾子の使い方などを掘り下げていきます。
publicやprivateの使い方は理解できていても、protectedまで理解できていない方も多いかと思います。コーディングの幅を広げるためにも、ここで基本的なアクセス修飾子の使い方はマスターしましょう。
- PG
- アクセス修飾子は主に、public、private、internal、protectedに分かれると思いますが、どれも重要になってくるから覚えておかなければならないですよね?
- PL
- もちろん全部重要です!前回はinternalについて解説しましたが、今回は他のすべてのアクセス修飾子について使い方を解説します。
実行環境
・Visual Studio Community 2017
目次
publicアクセス修飾子の使い方
C#で使うアクセス修飾子の代表格です。開発初心者の方がまず教わるのが、こちらのpublic修飾子だと思います。
publicはどこからでもアクセス可能な点が特徴として挙げられます。これは非常に便利です。どのアクセス修飾子を使う迷った場合には、publicを使えばプログラムは動作します。
しかし、開発する場合には便利ですが、修正する場合には作業が複雑になります。どこからでもアクセス可能なので、修正することでどこまで動作に影響するのかといった確認作業が必要です。そういったことも念頭に置いて、publicを使っての開発は行うべきだといえます。
1 2 3 4 5 6 7 8 9 10 11 12 |
using System; namespace TESTCLASS { public class Class1 { public void GetName() { Console.WriteLine("public"); } } } |
以下のプログラムにて、TESTCLASS.dllを参照します。実行するプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using System; using System.Windows.Forms; using TESTCLASS; namespace WindowsFormsApp28 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Class1 bbb = new Class1(); bbb.GetName(); } } } |
実行結果
protectedアクセス修飾子の使い方
publicやinternalが使いこなせれば、あとはprotectedもマスターしておきましょう。
protectedを理解する前に、前提知識として必要なのが「継承」です。C#で開発する場合、この継承はよく出てくる命令のひとつです。継承には親と子のような関係が発生し、継承元クラスを基底クラス(スーパークラス)、継承先のクラスを派生クラス(サブクラス)と呼ばれます。
基底クラス側のみで利用するならば、通常はprivateを使用します。派生クラスからの参照がある場合に、protectedを使用します。
1 2 3 4 5 6 7 8 9 10 11 12 |
using System; namespace TESTCLASS { public class Class2 { protected void GetName2() { Console.WriteLine("protected"); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 |
using System; namespace TESTCLASS { public class Class1 : Class2 { public void GetName() { GetName2(); } } } |
以下のプログラムにて、TESTCLASS.dllを参照します。実行するプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Windows.Forms; using TESTCLASS; namespace WindowsFormsApp28 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Class1 bbb = new Class1(); bbb.GetName(); } } } |
実行結果
privateアクセス修飾子の使い方
publicの次に多く使われるのが、こちらのprivateアクセス修飾子です。アクセスできる度合いが自分のクラスだけなので制限が一番厳しい修飾子です。
外部から参照されないメソッドや変数などは基本的にはprivateを利用して開発を行います。また、何もアクセス修飾子を明記しなければ、privateが自動的に割り当てられます。
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 |
using System; using System.Windows.Forms; namespace WindowsFormsApp28 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { GetName3(); } private void GetName3() { Console.WriteLine("private"); } } } |
実行結果
private protectedアクセス修飾子の使い方
こちらはC#7.2以降から搭載されたアクセス修飾子です。上述のprotectedアクセス修飾子とほとんど同じで、継承の親子関係で使用されます。唯一違う点が、他のプロジェクト(≒アセンブリ)からはアクセスできないことです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using System; namespace WindowsFormsApp28 { public class Class4 { private protected int num = 2; private protected int num2 = 5; public int Num { set { num = value; } get { return num; } } public int Num2 { set { num2 = value; } get { return num2; } } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using System; namespace WindowsFormsApp28 { public class Class3 : Class4 { public void add() { Console.WriteLine("{0} + {1} = {2}", num, num2, num + num2); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using System; using System.Windows.Forms; namespace WindowsFormsApp28 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Class3 ttt = new Class3(); ttt.add(); } } } |
実行結果
- PG
- アクセス修飾子の使い方を理解できました。これは他の言語でも同じように必要になってくるのでしょうか?
- PL
- 同じく.NET Frameworkで開発できるVB.NETでは、protected privateは使えませんし、internalはFriendに置き換わるなど多少の違いはあります。ですが意味は同じなので、ここで使い方をマスターすれば他の言語でも十分に活用できるでしょう。
アクセス修飾子は他の言語でも利用されている
クラスを使ってプログラミングを行うオブジェクト指向の言語では、JavaでもC++でもこのアクセス修飾子は出てきます。オブジェクト指向で開発を行う上では、publicやprivateだけに頼らずに、protected、internalも早めにマスターして、積極的に使い分けていきましょう。