C#でカノジョをつくる（4日目）

お疲れ様です。たなしょです。
今日からオブジェクト指向プログラミングについて勉強していきます。
この単元もJavaやC++やほかの言語でさんざん勉強してるのと現場で実際Javaのコードを書いてた時期もあったので割愛するところが多いかと思います。
## Getter,Setter
オブジェクト指向プログラミングとは？みたいな内容だったので記載は割愛します。
最近のIDEは優秀なのでGetter,Setterは自動で作ってくれるんでよね。この辺はあまり考える必要がないのかなと思います。（デザインパターンの話をすると深く考えないといけないんですけどね。）

## コンストラクター、デストラクター
C#ではデストラクターは```~```をつけて書くそうです。

```c#
~TestDes()
{
    Console.WriteLine("Test クラスのデストラクターが呼ばれました");
}
```
## アクセシビリティ
外部で使われたくないclass内でしか使いたくない変数や関数はprivateをつけましょうねってことですね。
この辺も業務でプログラムを書いてるとありがたみがわかるところですよね。（学生時代はなにがいいのかよくわかりませんでした。）

## プロパティ
この機能はすごく感動しました。
C#がきれいな文法だと言われているのに納得しました。

```c#
class Complex
{
    private double abs;
    private double arg;

    public double Re
    {
        set
        {
            double im = this.abs * Math.Sin(this.arg);
            this.abs = Math.Sqrt(value * value + im * im);
            this.arg = Math.Atan2(im, value);
        }
        get
        {
            return this.abs * Math.Cos(this.arg);
        }
    }

    public double Im
    {
        set
        {
            double re = this.abs * Math.Cos(this.arg);
            this.abs = Math.Sqrt(value * value + re * re);
            this.arg = Math.Atan2(value, re);
        }
        get
        {
            return this.abs * Math.Sin(this.arg);
        }
    }

    public double Abs
    {
        get
        {
            return this.abs;
        }
    }
}
```
このgetterとsetterが一目見ただけで分かる可読性の高さはとてもいいと思いました。

## 部分クラス
クラスの定義を複数に分割したい場合はC#では```partial```を付けるそうです。

```c#
partial class Sample
{
    // 処理1
}

partial class Sample
{
    // 処理2
}
```
クラス定義を分割したい時はどのような状況なんだろうと考えたのですが、そのような状況を考えることはできませんでした...

## 継承
ここも特に特筆すべきことはないので記載は割愛します。
個人開発してるとなかなか継承やinterfaceを使い機会がないなと思いました。

## is演算子, as演算子
is演算子はキャスト可能ならtrue、そうでないならfalseを返します。

```c#
class Base{}
class Test1 : Base{}

Base b;
b = new Test1()

if(b is Test1)
    Console.WriteLine("b = new Test1()")
```
as演算子は型変換できない場合は結果にnullを返します。

```c#
class Base{}
class Test1 : Base{}

Base b;
Test1 t;
b = new Test1()
t = b as Test1

if(t != null)
    Console.WriteLine("b = new Test1()")
```

## 多様性
基底のクラスを型にしていろいろなクラスが作れるよねってことですね。
自分はあまり設計でできてない気がします。

```c#
class Person
{
    protected string name;
    protected int age;

    public Person(string name, int age)
    {
        this.name = name;
        this.age = age;
    }

    public string Name { get { return this.name; } }

    public virtual int Age
    {
        get
        {
            return 0;
        }
    }
}

class Seventeenist : Person
{
    public Seventeenist(string name, int age) : base(name, age) { }
    public override int Age
    {
        get
        {
            return 17;
        }
    }
}

class PolymorphismTest
{
    static void Main()
    {
        Introduce(new Seventeenist("Ino", 24));
    }

    static void Introduce(Person p)
    {
        Console.WriteLine($"My name is {p.Name}.");
        Console.WriteLine($"I'm {p.Age} years old.");
    }
}
```
## 抽象化
interfaceについて勉強しました。
あまりこの辺は理解できてないです。パーツごとに分けてさらにそのパーツを拡張していくと可読性が上がりますよって意味で理解してます。

```c#
interface IMessageCollection
{
    void Add(string value);
    IEnumerable<string> Messages { get; }
}

interface INotificationCollection
{
    void Add(string value);
    IEnumerable<string> Notifications { get; }
}

class ServiceManager : IMessageCollection, INotificationCollection
{
    private List<string> notifications = new List<string>();
    private List<string> messages = new List<string>();
    public IEnumerable<string> Notifications
    {
        get { return this.notifications; }
    }
    public IEnumerable<string> Messages
    {
        get { return this.messages; }
    }
    void INotificationCollection.Add(string value)
    {
        this.notifications.Add(value);
    }

    void IMessageCollection.Add(string value)
    {
        this.messages.Add(value);
    }
}
```

## 最後に
この辺から理解できてないなと思う部分が増えてきてます。
今回記載してる以外にも色々なことを学んだのですが、なかなか自分の中で腹落ちしない部分もあったので記載するのはやめました。
今回はカノジョ（アプリ）を作ることが目的なので、理解ができていないところもとりあえず読んで次に進むようにしています。