1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C# 入門:オブジェクト指向

Last updated at Posted at 2023-10-21

はじめに

仕事でC#を使うことになりそうなので、Pythonの経験しかない私がC#の基本から学習していく過程をアウトプットしていこうと思います。
今回は、オブジェクト指向について学習したことをアウトプットします。

環境

  • Windows10
  • Visual Studio 2022

オブジェクト指向とは

  • オブジェクト = モノ

  • メリット

    • きれいなコードがけける
    • 作業スピードが上がる
    • 人間が把握できるプログラムが実現できる
  • プロパティとメソッドで成り立っている

「本」というクラスがあるとすると、以下のイメージになります。

図1.png

メソッド

VisualStudioのコンソールアプリケーション(.NETFramework)プロジェクトを開始するとデフォルトで生成されるProgram.csの中の、static void Main()の部分がメソッド

static void Main(string[] args)
{
}
  • メソッドはプログラムに必ず1つ用意しないといけない
  • Mainメソッドは必ず必要

メソッドを作って呼び出してみる

新しいメソッドStudyを作ってみます。

static void Study()
{
    //学習メソッド
    Console.WriteLine("C#を学習する");
}

MainメソッドでStudyメソッドを呼び出します。

メソッド名();で呼び出します。

Program.cs
static void Main()
{
    //メインメソッド
    Study();
}

全体のソースは以下のようになります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PractisClass
{
    internal class Program
    {
        static void Main()
        {
            //メインメソッド
            Study();
        }
        static void Study()
        {
            //学習メソッド
            Console.WriteLine("C#を学習する");
        }
    }
}

クラス

今回は以下のような勇者クラスを作成します。
図2.png
プロパティの部分が、

string name = "勇者";
int mp = 50;

メソッドは以下のようになります。
かっこで引数を受け取れ、メソッドの中で使えます。

void Attack()
{
    Console.WriteLine(name + "は攻撃した");
}
void Magic(int useMp)
{
    if (mp >= useMp) {
        Console.WriteLine(name + "は魔法を使った");
        mp -= useMp;
        Console.WriteLine("MPを" + useMp + "使って残りMPは" + mp);
    } else {
        Console.WriteLine(name + "はMPが足りず魔法を使えなかった");
    }
}
void Run()
{
    Console.WriteLine(name + "は逃げた");
}

呼び出すときは、かっこに引数をわたせます。

//メソッドを呼びだす
Attack();
int useMp = 5;
Magic(useMp);
Run();

全体は以下のようにな感じです。

Program.cs
using System;

namespace PractisClass
{
    internal class Hero
    {
        //勇者クラスのプロパティを定義する
        string name = "勇者";
        int mp = 50;

        static void Main()
        {
            //インスタンスオブジェクトを作る
            Hero hero = new Hero();
            //メソッドを呼びだす
            hero.Attack();
            int useMp = 5;
            hero.Magic(useMp);
            hero.Run();
        }
        void Attack()
        {
            Console.WriteLine(name + "は攻撃した");
        }
        void Magic(int useMp)
        {
            if (mp >= useMp) {
                Console.WriteLine(name + "は魔法を使った");
                mp -= useMp;
                Console.WriteLine("MPを" + useMp + "使って残りMPは" + mp);
            } else {
                Console.WriteLine(name + "はMPが足りず魔法を使えなかった");
            }
        }
        void Run()
        {
            Console.WriteLine(name + "は逃げた");
        }
    }
}

インスタンス

インスタンスとは、クラスという設計図から作成された物体。
オブジェクト指向のなかでの立ち位置は、以下のようになります。

  • オブジェクト:概念や物体をふんわり表現したもの
  • クラス:モノの概念や設計図のようなもの
  • インスタンス:クラスによって作成された物体
    「人間」クラスからインスタンスをnewしてみます。
    図4.png
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PractisClass
{
    class Human
    {
        //--------------
        //属性
        //--------------
        //年齢
        private int age;
        //--------------
        //操作
        //--------------
        //年齢設定
        public void setAge(int age)
        {
            this.age = age;
        }
        //年齢取得
        public int getAge()
        {
            return this.age;
        }
    }
    internal class Program
    {
        static void Main(String[] args)
        {
            //Humanクラスのインスタンス「yamada」を生成
            Human yamada = new Human();
            //年齢を設定
            yamada.setAge(18);
            //年齢を表示
            Console.WriteLine("山田の年齢:" + yamada.getAge());
        }
        
    }
}

ポイントは、年齢の設定とコンソールへの表示はクラスのHumanに対しておこなっているわけではなく、Mainメソッドでnewしたインスタンスに対して行っている事です。

コンストラクタ

クラスをnewした瞬間に実行される関数のこと。
インスタンスに情報を追加が事が出来ます。

勇者クラスがあったとすると、
名前、HP、MPをインスタンスが生成されたタイミングで渡すことができます。
今回は、プレイヤークラスをnewするときに名前を追加できるコンストラクタを作っていきます。

Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PractisClass
{

    internal class Program
    {
        static void Main(String[] args)
        {
            //newするときにかっこの中で名前を追加できる
            var player1 = new Player("勇者すずき");
            player1.Attack();
            var player2 = new Player("勇者たなか");
            player2.Attack();
            player1.Attack();
        }

    }
    public class Player
    {
        //newしたときに引数を受け取り、Playerクラスの名前を定義する
        private string name;
        public Player(string name)
        {
            this.name = name;
        }
        public void Attack()
        {
            Console.WriteLine(this.name + "はスライムに攻撃した");
        }
    }

}

出力

勇者すずきはスライムに攻撃した
勇者たなかはスライムに攻撃した
勇者すずきはスライムに攻撃した

Playerクラスを定義した直後に

private string name;
public Player(string name)
{
    this.name = name;
}

と書くことで、

var player1 = new Player("勇者すずき")

のようにnewするときのかっこに名前を渡せばプロパティを追加出来ます。

1
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?