C#(オブジェクト指向)の基本(2)

昨日に引き続き、#ゆーじ勉強週間 2日目の記事です。

他の記事はこちら

 

今日の勉強テーマ

今日の勉強テーマは、昨日に引き続き「C#(オブジェクト指向)の基本」です。

勉強したことのメモのような感覚なので、上手くまとまってなかったりいろいろ飛ばしたりしてますがご了承ください。

 

昨日同様、こちらのサイトを参考にしました。
https://ufcpp.net/study/csharp/

抽象化

修飾子「abstract」を付ける。

抽象クラスインスタンスを生成できないクラス
抽象メソッド実体を持たずに意味だけ定義し、派生クラス内で実装するメソッド

抽象メソッドは抽象クラス内でしか定義できない。
プロパティもabstractを付けて抽象プロパティにすることができる。

インターフェース

クラス外部から見た規約だけを定める、publicな抽象メソッドだけをもつもの。
フィールドを持てない代わりに多重継承できる。

インターフェース ≒ 抽象メソッドのみを持つ抽象クラス

interface インターフェース名
{
  メソッド・プロパティの宣言
}

staticメソッドを定義することはできず、全てpublic virtualになる。

 

C#8.0からインターフェースの制約が緩和され、メソッド/プロパティのアクセサー実装やアクセシビリティの明示的な指定、静的メンバーの実装が可能になった。

これによって、インターフェースと抽象クラスの違いは
フィールドを持てない代わりに多重継承できる。
ぐらいになった。

ジェネリック

ジェネリック:型だけ違って処理の内容が同じようなものを作るときに使う。

class クラス名<型引数>
    where 型引数中の型が満たすべき条件
{
    クラス定義
}
アクセスレベル 戻り値の型 メソッド名<型引数>(引数リスト)
    where 型引数中の型が満たすべき条件
{
    メソッド定義
}

whereでの制約条件

型引数の制約条件はwhereを使って定義できる。

where T : struct型Tは値型
where T : class型Tは参照型
where T : [baseClass]型Tは[baseClass]を継承したクラス
where T : [interface]型Tは[interface]を実装したクラス
where T : new()型Tは引数なしのコンストラクタを持つクラス
where T : Enum型Tは列挙型
where T : Delegate型Tはデリゲート型

タプル

多値戻り値。

型を記述できる部分ならほぼ全て

(int x, int y)

のような形式で記述できる。

var v = new (int x, int y)(1, 2);

のような記述はできないけど、

var a = new(int x, int y)[10];

のように配列の作成ならできる。

 

型推論、入れ子、オーバーロードも可能。

C#7.3以降であれば、「==」「!=」でのタプル同士の比較も可能。

タプルの分解

(int x, int y) TupleType(){
    return (1, 2);
}

(int x, int y) = TupleType();

のように、int型変数x, yを宣言しつつそれぞれに代入することができる。(分解宣言)

int x, y;

(x, y) = TupleType();

宣言済みの変数にもそれぞれ分解して代入できる。(分解代入) 

switch文の式版

C#8.0からswitch文の式版が追加された。
以下のように使う。

public void GetCharaId(string charaName)
{
    int id = charaName switch
    {
        "player" => 1,
        "enemy => 2,
        "npc" => 3,
        _ => -1
    };
    Console.WriteLine(id.ToString());
}

まとめ

今日も昨日に引き続き、C#の基礎を勉強した。

明日もデリゲート、ラムダ式、イベントを中心に勉強予定。

 

次の記事

コメント