独習C#勉強メモ3

独習C#を読んで自分が知らなかったことまとめ

アップキャスト


子クラスを親クラスに代入する。別に特別な構文は必要ない
//親クラス
class Person{
    //定義内容
}
//子クラス
class BusinessPerson : Person{
    //Personクラスを継承した小クラスの定義内容
}

Person p = new BusinessPerson();
//親クラスの中に小クラスのインスタンスをそのまま入れれる、

ダウンキャスト


小クラスに親クラスを入れる。(入れたいクラス名)、クラス名 as 入れたいクラス名とも書くことができる。asで書くと正しくキャストできない場合nullが帰ってくる。

Person p = new Person();
BusinessPerson bp = (BusinessPerson)p;

拡張メソッド


すでにあるクラスに継承とか使わないでメソッドを追加する方法。 -条件はstaticクラスのstaticメソッドであること。 -追加したいメソッドの第一引数にthis 拡張するクラス名 好きな引数を割り当てること

抽象メソッド


中身を定義しないクラス。これを含むクラスを抽象クラスという。 これは処理を子に丸投げする方法っぽい。 鳥は飛ぶけどすずめと鷹の飛び方は具体的に違うからそれぞれで詳しく書いてね的な?

abstract class Bird
    {
        public double num1;
        public double num2;
        //ここでは具体的な内容を定義しない
        public abstract string flyMethod();
    }
class ChunChun : Bird
    {
        public override string flyMethod()
        {
            //BirdクラスにおけるflyMethodメソッドを実装する。
            throw new NotImplementedException();
        }
    }

インターフェース


C# Interfacesの話の掘り下げ。インターフェースはざっくりいうとクラスの中のメソッドが全部抽象メソッドのクラス。クラス名の先頭にinterfaceって書く。 普通のクラスと違って、多重継承ができるみたいです。 インターフェース内では定義できるものが限られてる。 - メソッド - プロパティ - インデクサ - イベント
が定義可能。

列挙型


定数を表現するのに適してる。classで表すとすっきり表せなかったり変なアクセスを許容してしまう事がある。修飾子はpublicとinternalの二種類が取れる。 public:すべてのクラスからアクセス可能 internal:同じアセンブリ(プロジェクト)内からのみアクセス可能。ほぼほぼ使うことはなさそう。
public enum Item{
    Potato.
    Tomato.
    Cheese
}
class Cook{
     public void CookMaterials(Item.Potato){
         //このように簡単にPotatoという変数を間違いなく呼び出せる
     }
}

ジェネリッククラス(generic class)


<適当な文字>といった具合に特定の型を受け取るための型パラメーターを設定する. 慣例的にT(type),K(Key),V(Value)みたいなかっこいいのを使うらしいけど備え付けの決まった文字なのかどうかわからなくなったので今回はHeppokoを使う。

class MyGenerics<Heppoko>
    {
        private Heppoko heppoko;
        //コンストラクタは省略できないっぽいのでクラス名と同じものを定義。
        //初期化時になにか情報を渡したい場合は引数とブロックの中身を書く
        public Heppoko generic(Heppoko heppoko)
        {
            return heppoko;
        }
    }
class MyNumber
    {
        public void myMethod()
        {
            long longMum = 10;
            //ここでインスタンスを作る。
            //Heppoko型じゃなくてLong型にするわ的な?
            var myLong = new MyGenerics<long>();
            //メソッドも上書きできる。Heppoko型じゃなくて今回はlong.
            //intとか他のでも問題ない
            myLong.generic(longMum);
        }
    }

適当に作ったHeppoko型をインスタンスを作るときにlong型に変換できてる。

型パラメータの制約条件(whereを使う)

class MyGenerics<T> where T : Icomparable<T>
{
    public int compareType(T x , T y)
    {
        return x.CompareTo(y);
    }
}

Tを使って幅広く受け取るとT型はCompareToメソッドを持っていないクラスである可能性があるのでそういうとき用にwhereを使って制約条件をつける。そうしないとエラーになる。
特徴

  • 複数の制約条件をつけることができる。
  • 複数の制約条件をつける場合は順番がある 詳細は必要になったとき調べる。

ボクシング(ボックス化)


...
//メソッド内
int data = 100;
object obj = data;

こんな具合にobject型はint型などすべての型を代入でき、代入することによって発生する処理をボクシング。逆にint型とかにobject型をキャストして入れるときに起こる処理をアンボクシングと言う。 これはあまり発生させないほうがいいみたいです。


See also