C#の勉強記録その3

続きです。前回はアクセス修飾子、プロパティ、インデクサまで書きました。

static修飾子

アクセス修飾子とはまた別のやつ。
通常クラス内で定義したフィールドやメソッドはインスタンス生成後はインスタンスごとに値が保持される。

「ノコノコ」クラス(フィールド「count」をもつ)
生成->ノコノコA インスタンス(ノコノコAの「count」)
生成->ノコノコB インスタンス(ノコノコBの「count])
AのcountとBのcountに関連性はない。

これが、クラス内でstaticを使って定義すると
そのフィールドやメソッドはクラス側で保持される。

上の図だと、HPをpublic static int count ;とかで定義してたら
ノコノコAとノコノコBそれぞれがcountを1増やした場合、
ノコノコクラスの方でcountを保持しているためcount == 2となる。

分かりやすいようで分かりにくいね。
まあクラスに紐づいた定義をするためのもんってくらい。使いどころは不明。

抽象クラス

abstract class pekepeke{}って書く。abstractって単語かっこいいね。
抽象クラスは他のクラスが継承するために作られたクラスで、それ自体をインスタンス化できない。
継承する側のルールは普通の継承と同じ。

abstract class Car{}

class vits : Car{}
とこんな感じ。
抽象クラス内のフィールド、メソッドは自動的に継承したクラスも保持することになる。

さらに、抽象クラス内で定義するメソッドにもabstractをつけると
継承したクラスはメソッドも継承しないといけない。
このとき、抽象クラス側はメソッドの中身までは定義できない。(単純に同じ処理をする同じメソッドを継承させたいなら普通に定義すればいいから)
継承したクラスは、public override void ***(){}みたいにしてoverrideで継承を宣言したうえでメソッドを定義しないといけないという縛りができる。

あと、抽象クラスがあるからって必ず誰かが継承していないといけないというわけではないみたい。(試した)

 で、クラスまではやらなくていいけど絶対定義させたいメソッドがある場合には下記を使う。

インターフェース

抽象クラスの簡略化版と言ってよさそう。

抽象クラスではフィールド、メソッド、抽象メソッドを記載して継承させることができた。

インターフェースは「抽象メソッドだけ準備したい」という時に使うもので、記載も抽象クラスを使うより楽になる。

Interface douzo
{
     public abstract void punch();
}
class aiyo : douzo
{
    public void punch()
    {
        console.writeline("yahho");
    }
}

インターフェースは継承される前提でメソッドを記述するので、abstractと書かなくてよい。継承側もoverrideを書かなくていい。見た目がすっきりする。

特定のクラス群に同名の別メソッドを必ず実装させたい場合に使う。どんな場合だ?

 

実務のコーディングでこれらを使うような複雑な案件をまだやっていないので、すきを見て活用してものにしていきたい。

今日はここまで!