型には数値以外にも様々なものがありまた自分で作り出すこともできます。 型を作る機能であるクラスを作ってみます。
クラスを定義します。
class クラス名
{
}
とすることで作ることができます。 また使う場合は以下のようにします。
クラス名 変数名 = new クラス名();
LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。
void Main()
{
Class1 c = new Class1();
c.Dump();
}
class Class1
{
}
クラスは内部に変数を持つことができます。 クラス内の変数のことをフィールドといいます。 クラス内で以下のように宣言すると使えるようになります。
アクセシビリティ 型名 フィールド名;
フィールドは初期化することができます。
クラスに含まれるフィールドにアクセスするためには以下のようにします。
変数名.フィールド名
LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。
void Main()
{
Class1 c = new Class1();
c.a.Dump();
c.a = 10;
c.a.Dump();
}
class Class1
{
public int a = 0;
}
クラスは関数も持つことができます。 クラス内の関数をメソッドと呼びます。 クラス内で以下のように宣言すると使えるようになります。
アクセシビリティ 戻り値の型名 メソッド名(引数リスト);
クラスに含まれるメソッドにアクセスするためには以下のようにします。
変数名.メソッド名(引数リスト);
LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。
void Main()
{
Class1 c = new Class1();
c.a.Dump();
c.Add();
c.a.Dump();
}
class Class1
{
public int a = 0;
public void Add()
{
a++;
}
}
アクセシビリティはクラス内の要素をどの範囲で公開するかを指定します。 アクセシビリティ|説明 ------------|---- public |どこからでもアクセス可能 protected |クラス内部と、派生クラスの内部からのみアクセス可能 internal |同一プロジェクト内のクラスからのみアクセス可能 protected internal|同一プロジェクト内のクラス内部、または派生クラスの内部からのみアクセス可能 private |クラス内部からのみアクセス可能 何も指定しない限りprivateです。
LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。
void Main()
{
Class1 c = new Class1();
c.a.Dump();
}
class Class1
{
private int a = 0;
}
エラーコード(CSXXXXとなっているところです)を検索してみましょう。 以下の文字を入力し実行しましょう。
通常のプログラミングではフィールドはかくしてメソッドを公開します。 なぜならメソッドの内部を書き換えることはできても、フィールドに手を加える事ができないからです。 しかしそれではただフィールドから読み出しだけや書き込みだけのメソッドが大量にできてしまいます。 そこでC#にはプロパティというフィールドの操作に似たことのできる機能があります。 クラス内で以下のように宣言すると使えるようになります。
アクセシビリティ 形名 プロパティ名
{
get
{
読み込み処理
}
set
{
書き込み処理
}
}
プロパティのsetの中ではvalue変数が自動的に定義され書き込むべきデータが入っています。
LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。
void Main()
{
Class1 c = new Class1();
c.A.Dump();
c.A=10;
c.A.Dump();
}
class Class1
{
private int a = 0;
public int A
{
get
{
return a;
}
set
{
a = value;
}
}
}
またget、setそれぞれにアクセシビリティを指定することが可能です。
LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。
void Main()
{
Class1 c = new Class1();
c.A.Dump();
c.A=10;
c.A.Dump();
}
class Class1
{
private int a = 0;
public int A
{
get
{
return a;
}
private set
{
a = value;
}
}
}
エラーコード(CSXXXXとなっているところです)を検索してみましょう。 以下の文字を入力し実行しましょう。
現実で使うと上のようにただ変数を読み書きするだけのプロパティをよく書きます。 そこで省略をすることが可能です。
LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。
void Main()
{
Class1 c = new Class1();
c.A.Dump();
c.A=10;
c.A.Dump();
}
class Class1
{
public int A{get;set;}
}
あるクラスで定義されているものを流用して新しいクラスを作ることができます。 これを継承といいます。 継承は以下のように行います。
class クラス名:継承するクラス名
{
}
一度に継承できるクラスは1つです。
LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。
void Main()
{
Class2 c = new Class2();
c.A.Dump();
c.B.Dump();
}
class Class1
{
public int A;
}
class Class2:Class1
{
public int B;
}
継承したクラスは継承元のクラスとして扱うことができます。 しかし使えるのは継承元のクラスの要素のみです。
LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。
void Main()
{
Class1 c = new Class2();
c.A.Dump();
c.B.Dump();
}
class Class1
{
public int A;
}
class Class2:Class1
{
public int B;
}
エラーコード(CSXXXXとなっているところです)を検索してみましょう。 以下の文字を入力し実行しましょう。
特定のメソッドまたはプロパティは継承先で書き換えることができます。 これをオーバーライドと言います。 特定のメソッドとはvirtualのついたメソッドです。
LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。
void Main()
{
Class1 c = new Class1();
c.A();
c.A();
c=new Class2();
c.A();
c.A();
}
class Class1
{
public int a = 10;
public virtual void A()
{
a.Dump();
}
}
class Class2:Class1
{
public override void A()
{
(++a).Dump();
}
}
継承先のクラスで定義してほしいが継承元のクラスでは定義できないということがあります。 この時はクラスを抽象クラスにします。 抽象クラスは要素が未完成のため変数にできません。
LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。
void Main()
{
Class1 c=new Class2();
c.A();
c.A();
}
abstract class Class1
{
public int a = 10;
public abstract void A();
}
class Class2:Class1
{
public override void A()
{
(++a).Dump();
}
}
継承は親クラスが様々な処理を実装しますが、そんなことせずにただメソッドやプロパティは何があればいいかを 決めるだけにしたいことがあります。この定義ができるのがインターフェースです。 インターフェースはいくらでも継承することができます。インターフェースの要素はすべてpublicです。
LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。
void Main()
{
Interface1 i1= new Class2();;
i1.A();
Interface2 i2=new Class2();;
i2.B();
}
interface Interface1
{
void A();
}
interface Interface2
{
void B();
}
class Class2:Interface1,Interface2
{
int a;
public void A()
{
(++a).Dump();
}
public void B()
{
(--a).Dump();
}
}