paizaで学んだC#でのクラスの考え方とコードの書き方のまとめ

426 回閲覧されました
みなさんこんにちは、jonioです。
paizaで学んだC#でのクラスの考え方とコードの書き方についてまとめます。
基本的な内容から書きます。
目次
クラス・インスタンス・フィールド・メソッドとは
例えで説明した方がイメージが湧きやすいのですがクラスは例えばプラモデルの設計図です。
設計図からプラモデルができますがプラモデルをインスタンス(オブジェクト)と言います。
できたプラモデルですが名前がありますがそれをフィールドと言います。
またプラモデルが飛ぶとか歩くとかのどんなアクションができるかをメソッドと言います。
まとめると↓になります。
- 設計図 : クラス
- 設計図からできた物 : インスタンス
- 名前 : フィールド
- アクション名 : メソッド
それではクラスの書き方から見ます。
クラスの書き方
まずはクラスを記述しますがコードを↓にします。
11行目〜17行目がクラスを定義していてクラスの書き方は「public class クラス名{ }」です。
{ }の中にメソッドを書きますがクラスの中で書いてクラスの場合ではないメソッドと書き方は同じです。
次はインスタンスでメソッドを呼び出します。
インスタンスの書き方
コードを↓にします。
9行目の「new Demo()」でインスタンスを作っていますが書き方は「new クラス名();」です。
これでメソッドを呼び出す事ができるようになったのですがメソッドの呼び出しは10行目の「walk.Walk();」で書き方は「インスタンス.メソッド名();」です。
次はフィールドです。
フィールドの書き方
コードを↓にします。
メソッドを書くまでの流れは同じです。
フィールドはまず14行目で設定しますが書き方は「public 型名 名称」で今は「public string name」としています。
そしてコンストラクタというメソッドがありそれでフィールドの値を設定するのですが16行目〜19行目です。
コンストラクタというのはインスタンスが生成された(7行目のnew Demo(“勇者”);)直後に呼び出されるメソッドの事で書き方は「public クラス名(型名 引数名){ }」となり今は「public Demo(string name){ }」です。
フィールドの設定の書き方は18行目の「this.name = name;」です。
nameはフィールドですが「this」はメソッドの中でフィールドを使う場合に付けないといけません。
ですが「this.name = name;」でフィールドの値を設定していると考えた方が最初は受け入れやすいと思います。
14行目・16行目・18行目(の右辺)・23行目のnameですが7行目の「new Demo(“勇者”);」の勇者が入ります。
このコードを出力すると「勇者は歩く」と出力されます。
フィールドに複数の値を代入する場合
今はフィールドに値を1つしか入れませんでしたが複数の値を入れます。
配列を使うのですがコードを↓にします。
これで「勇者は歩く・戦士は歩く・魔法使いは歩く」と表示されます。
クラスの中で配列を使っているのは10行目〜14行目ですがこの時の配列の書き方は「クラス名[ ] 配列名 = { }」となり{ }の中に配列に入れる要素を書きますが書き方は「new クラス名(“要素名”)」です。(クラス名は25行目からDemoになります)
クラスのメソッドに戻り値を使う
コードを↓にします。
「合計金額は1800円です」と表示されます。
7行目の120と15を25行目のpriceとquantityに代入して「return price * quantity;」を8行目の「GetTotalPrice()」で使っています。
アクセス修飾子
↓のコードで考えます。
3行目・5行目・12行目・17行目・23行目にpublicがあり14行目・15行目にprivateがありますがこれをアクセス修飾子と言います。
違いは下記になります。
- public : どのクラスやメソッドからもアクセスが可能
- private : クラスの中からだけアクセスが可能
アクセス修飾子は全部で6種類あるがとりあえずpublicとprivateの2つだけを知っていれば大丈夫です。
使用例
まずはprivateですが↓のコードはエラーになります。
エラーになる理由は11行目でnameは17行目でアクセス修飾子を「private」にしているのでPlayerクラスの中でしか使えずnameをExample クラスで使おうとしたからです。
↓の様にprivateをpublicにすればエラーは出ません。
今はフィールドで説明しましたがメソッドも同様です。
↓はエラーになります。
エラーになった理由は24行目のアクセス修飾子がprivateになっているのにExampleクラスの中の9行目でWalkメソッドを使っているからです。
24行目のアクセス修飾子をpublicにすればエラーはでません。
アクセス修飾子の省略
アクセス修飾子を省略した場合はどうなるかを説明します。
まずはフィールドです。
フィールドのアクセス修飾子の省略
↓のコードで考えます。
16行目のアクセス修飾子を取りました。
この場合はエラーになります。
理由はアクセス修飾子を省略すると自動的にprivateになるからです。
次はコンストラクターです。
コンストラクターのアクセス修飾子を省略
↓のコードで考えます。
18行目のアクセス修飾子を省略しています。
この場合もエラーになります。
理由はフィールドと同じでアクセス修飾子を省略すると自動的にprivateになるからです。
次はメソッドです。
メソッドのアクセス修飾子を省略
↓のコードで考えます。
23行目のアクセス修飾子を省略しています。
この場合もエラーになります。
理由はフィールドと同じでアクセス修飾子を省略すると自動的にprivateになるからです。
次はクラスです。
クラスのアクセス修飾子を省略
↓のコードで考えます。
15行目のアクセス修飾子を省略しています。
この場合もエラーになりません。
クラスのアクセス修飾子を省略すると「internal」というプロジェクト内だったらどこのファイルからでも利用する事ができるアクセス修飾子になります。
フィールドに付いたstatic
複数のフィールで共通に使う事ができるようにするにはstaticを使えば実現できます。
例えば↓のコードを考えます。
7行目・10行目でインスタンスを生成していますがインスタンスを生成するたびにフィールドの値が1ずつ増えるcountフィールドを設定します。
コードを↓にします。
20行目でprivateの後にstaticがありますがこれで共通のフィールドになります。
22行目〜27行目はコンストラクタなので7行目で20行目のcountの値が1になって10行目でcountの値が2になります。
そして36行目〜39行目のGetCountメソッドを12行目で呼び出して「商品は2種類です」と表示されます。
メソッドに付いたstatic
メソッドを使う時はインスタンスを生成しないといけないがメソッドにstaticを付けるとインスタンスの生成をしなくてもいいです。
例えば↓のコードですが5行目のMainメソッドにstaticが付いているのでインスタンスを生成せずに使用できます。
プロパティ
privateフィールドで読み書きや計算をする機能です。
先ほど「アイテムは2種類です」と表示したプログラムは↓でした。
これをプロパティを使って書き換えると↓になります。
24行目〜34行目がプロパティになります。
24行目のCountですがメソッドと違って「( )」は付けません。
Countプロパティの中身ですが呼び出す時は26行目〜29行目のgetになり値を設定する時は30行目〜33行目のsetになります。
12行目・42行目の「Count」はプロパティ名になっています。
「アイテムは2種類です」と表示するプログラムの流れは下記になります。
まず種類数を設定するために20行目を書きます。
そして20行目のcountを使うために24行目〜34行目でCountプロパティの設定をします。(プロパティの名称は先頭を大文字にします)
そしてインスタンス(7行目と10行目)が呼び出された時にプロパティの値を増やす設定をコンストラクタの中でします。(42行目)
42行目のcountですが値が1増えた時に32行目のvalueの中に入り値を32行目のcountに渡します。
そしてcountの値を28行目で呼び出せる様にして12行目の「Item.Count」で種類の数を表示します。
プロパティをコンストラクタの中でのみ使用できる様にする
今のままでは24行目のCountの値ですがどこからでも変更する事ができますがそれでは使い勝手が悪いです。
そこでインスタンスの中でのみ値が変更できるコードに変えます、↓です。
28行目のsetの前にprivateを付ければCountの値をコンストラクタの中でのみ変更できる様にします。
プロパティの省略した書き方
コードを↓にします。
この書き方でも 「アイテムは2種類です」と表示されます。
この書き方の場合は元々あったcountフィールド(private static int count = 0;)はなくてもいいです。