C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

コンストラクタについて

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■100800 / inTopicNo.1)  コンストラクタについて
  
□投稿者/ しーや (8回)-(2022/10/28(Fri) 01:27:34)

分類:[C#] 

c#でタイトルの範囲を勉強中なのですが、ちゃんと理解できてるか不安です。
勘違いだといけないので、下記のコードと自分の考えを書いたものが正しいか評価お願いします。
*スクリプトは2枚で後者のスクリプトをunityのゲームオブジェクトに入れています。


1つ目

public class Character //クラス
{
public string name; //変数1
public int exp = 0; //変数2

public Character () //コンストラクタ(引数ないのでパラメータ不要)
{
name = "no name"; //変数1をnullから書き換え
}
public Character(string name) //コンストラクタとパラメータ
{
this.name = name; //パラメータの"name"では呼び出せないので変数1の"this.name"に置き換え
}
}


2つ目

void Start()
{
  Character hero = new Character(); //クラスの"Character"でこの変数がインスタンスだと示す, 変数 = パラメータがない方のコンストラクタを呼び出す(=変数1を書き換える)
Debug.LogFormat("Hero: {0} - {1} EXP", hero.name, hero.exp); //変数1と変数2を書き出す

Character heroine = new Character("aaa"); //クラスの"Character"でこの変数がインスタンスだと示す, 変数 = パラメータ付きのコンストラクタを呼び出して初期化(変数"name"を"aaa"に)
Debug.LogFormat("Hero: {0} - {1} EXP", heroine.name, heroine.exp); //変数1と変数2を書き出す
}


以上です。
わかりにくかったら補足します。
よろしくお願いします。

引用返信 編集キー/
■100801 / inTopicNo.2)  Re[1]: コンストラクタについて
□投稿者/ KOZ (342回)-(2022/10/28(Fri) 06:19:14)
No100800 (しーや さん) に返信
> 勘違いだといけないので、下記のコードと自分の考えを書いたものが正しいか評価お願いします。

間違ってはいないと思います。
ただコンストラクタについては、処理を共通化するために次のように書くことが多いです。

public class Character1
{
    public string name;
    public int exp;

    public Character1() : this("no name") { }

    public Character1(string name)  {
        this.name = name;
    }
}

引数の無いコンストラクタが呼ばれたら、引数のあるコンストラクタを呼び出します。

パターンはもう一つあって

public class Character2
{
    public string name;
    public int exp;

    public Character2() {
        Initialize("no name");
    }

    public Character2(string name)  {
        Initialize(name);
    }

    private void Initialize(string name) {
        this.name = name;
    }
}

これは共通処理の前にいろいろ処理を行う場合に使います。

System.Drawing.Font クラスがこのパターンです。
https://referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Advanced/Font.cs,7c692e253eb24b01

引用返信 編集キー/
■100802 / inTopicNo.3)  Re[1]: コンストラクタについて
□投稿者/ ビール呑み (7回)-(2022/10/28(Fri) 06:20:54)
No100800 (しーや さん) に返信

パッと見た感じ、概ね間違っていないと思います

unityは使ったことがないので細かい文法や用語の評価はできませんが、
実行環境で想定通り動くのならば大丈夫でしょう

気になったのは「//クラスの"Character"でこの変数がインスタンスだと示す」かな
ご本人がどう理解して何を伝えようとしているのかこの文章だとわからない

私がこの部分にコメントをつけるとしたら

・"Character"クラスをインスタンス化する
・インスタンス変数hero/heroineを"Character"クラスとして宣言する

あたりになるかと思いますが、しーやさんがここで伝えたいことと一致しているでしょうか?


あと、クラス変数の変数名とコンストラクタ引数の変数名は変えておいた方がよいかも
紛らわしいですからね
また、「name」みたいな抽象的すぎる変数名は使わない方が無難でしょう

※このあたりは下手につつくと論争の火種になってメンドくさいので深くツッコまないこと

引用返信 編集キー/
■100803 / inTopicNo.4)  Re[2]: コンストラクタについて
□投稿者/ KOZ (343回)-(2022/10/28(Fri) 07:37:47)
2022/10/28(Fri) 07:38:08 編集(投稿者)
No100801 (KOZ) に返信

あまり見かけませんが、最初のパターンの逆で引数のあるコンストラクタから
引数の無いコンストラクタを呼び出すケース。
実装したあとで機能追加していったのかなぁ

public class Character3
{
    public string name;
    public int exp;

    public Character3() {
        // 初期処理
    }

    public Character3(string name) : this() {
        this.name = name;
    }
}

引用返信 編集キー/
■100804 / inTopicNo.5)  Re[3]: コンストラクタについて
□投稿者/ ぶなっぷ (298回)-(2022/10/28(Fri) 10:19:39)
直接の回答は、みなさんのお話通りですが、なぜ、
みなさん、コンストラクタから別のコンストラクタを呼ぼうとしてるか分かりますか?

コンストラクタの役目は初期化です。
たとえ、複数のコンストラクタがあっても、共通して絶対に行いたい初期化というのが
あることもあるわけです。

たとえば、
  class Catalog
みたいなクラスがあって、カタログのデータを取得できるものとします。
カタログの実体は、実はXMLファイルでCatalogクラスに隠蔽したいとします。

そんな感じの設計なら、さくっとコンストラクタでXMLファイル読み込んじゃうのが
いいですよね。

これらのコンストラクタなら、
  Catalog(Kind kind)         // 製品種別を引数に持つコンストラクタ
  Catalog(string kind_name)  // 製品種別名称を引数に持つコンストラクタ
  Catalog()                  // 全製品のXMLを一気に読み込んじゃうコンストラクタ

XMLファイルを読み込む処理自体は共通なので、どれかのコンストラクタに、
MLファイルを読み込む処理を実装して、他のコンストラクタからは、そのコンストラクタ
を呼ぶようにします。

これをやらないと何が不都合かというと...
将来、XMLファイルのフォーマットが変わった時に、3つのコンストラクタ全てを同じ
ように修正しなきゃいけないわけです。

同様に、
異常系の処理、「そんなタグ名知らん」「必要なタグが見つからん」...などを
いちいち3つのコンストラクタにコピーコードで入れられたらたまらんというわけです。

なんとなく伝わったかな?

引用返信 編集キー/
■100812 / inTopicNo.6)  Re[2]: コンストラクタについて
□投稿者/ しーや (9回)-(2022/10/28(Fri) 19:31:31)
No100801 (KOZ さん) に返信
> 間違ってはいないと思います。

ありがとうございます。

> ただコンストラクタについては、処理を共通化するために次のように書くことが多いです。

まだ知らない記法があったので、今後でてくるかもしれません。そのときに見返したいと思います。
ありがとうございました。
解決済み
引用返信 編集キー/
■100813 / inTopicNo.7)  Re[2]: コンストラクタについて
□投稿者/ しーや (10回)-(2022/10/28(Fri) 19:38:58)
No100802 (ビール呑み さん) に返信
> パッと見た感じ、概ね間違っていないと思います

ありがとうございます。

> あたりになるかと思いますが、しーやさんがここで伝えたいことと一致しているでしょうか?

あってます。
この範囲の理解が曖昧でうまく言語化できてないですね。すいません。

> あと、クラス変数の変数名とコンストラクタ引数の変数名は変えておいた方がよいかも
> 紛らわしいですからね
> また、「name」みたいな抽象的すぎる変数名は使わない方が無難でしょう

コードは勉強に使ってる本に書いてあったもののママですね。
きっとthis.の使い方を説明したかったのと、コードが少ないから抽象的でもいいかー、って感じでしょうかね。
ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ