Skip to content

第10章 クラスについて掘り下げる

この章では、第7章から学習してきたクラスについて、さらに実践的な使い方を学習します。

第7章では、クラス、オブジェクト、プロパティ、メソッドの基本を学習しました。

Employee employee = new Employee();
employee.EmployeeId = 1001;
employee.Name = "山田太郎";
employee.Department = "営業部";
employee.PrintProfile();

第8章では、static を使った静的メソッドや静的クラスを学習しました。

第9章では、StringMathDateTimeFile など、.NETに用意されているクラスを利用しました。

この章では、自分で作るクラスをより使いやすく、より安全にするために、次の内容を学習します。

メソッドの戻り値
メソッドのオーバーロード
省略可能な引数
コンストラクター
プロパティのget / set
読み取り専用プロパティ
private set
プロパティの初期化

これらは、実際のC#開発でよく使われます。

特に、コンストラクターやプロパティの制御は、オブジェクト指向プログラミングで重要になる カプセル化 の考え方にもつながります。

ただし、この章では難しく考えすぎず、まずは次のように理解することを目指します。

オブジェクトを作るときに必要な値を設定する
不正な値が入らないようにする
外から変更してよい値と、変更させたくない値を分ける
クラスを使う側が分かりやすく使えるようにする

この章でできるようになること

Section titled “この章でできるようになること”

この章を終えると、次のことができるようになります。

  • メソッドは intstringbool、自作クラスなど、さまざまな型を返せることを説明できる
  • 戻り値のあるメソッドを定義できる
  • 同じ名前で引数の異なるメソッドを定義できる
  • メソッドのオーバーロードを説明できる
  • 省略可能な引数を持つメソッドを定義できる
  • コンストラクターの役割を説明できる
  • 引数なしコンストラクターを作成できる
  • 引数付きコンストラクターを作成できる
  • コンストラクターのオーバーロードを使える
  • get / set を使ったプロパティを定義できる
  • プロパティに値のチェック処理を入れられる
  • 読み取り専用プロパティを作成できる
  • private set を使って、外部からの変更を制限できる
  • プロパティの初期値を設定できる

項目内容
開発環境Visual Studio 2022
プロジェクト種類コンソール アプリ
対象フレームワーク.NET 8
プロジェクト名Chapter10_ClassDetails

作業を始める前に、次の内容を確認してください。

  • クラスを作成できる
  • プロパティを定義できる
  • メソッドを定義できる
  • new を使ってオブジェクトを作成できる
  • 戻り値のあるメソッドを呼び出せる
  • 引数のあるメソッドを作成できる
  • 静的メソッドとインスタンスメソッドの違いをおおまかに説明できる
  • 第9章の内容をGitに提出済みである

10-1 メソッドはどんな型でも返せる

Section titled “10-1 メソッドはどんな型でも返せる”

メソッドは、処理を実行するだけでなく、結果を呼び出し元に返すことができます。

この返される値を 戻り値 といいます。

第7章では、社員情報を文字列として返すメソッドを作成しました。

public string GetProfileText()
{
return $"{EmployeeId}{Name}{Department}";
}

このメソッドは、string 型の値を返します。

string profileText = employee.GetProfileText();

まず、売上金額を計算して int 型で返すメソッドを確認します。

using System;
class Program
{
static void Main()
{
Sale sale = new Sale
{
ProductName = "ノート",
UnitPrice = 180,
Quantity = 5
};
int amount = sale.GetAmount();
Console.WriteLine($"商品名:{sale.ProductName}");
Console.WriteLine($"金額:{amount}");
}
}
class Sale
{
public string ProductName { get; set; } = "";
public int UnitPrice { get; set; }
public int Quantity { get; set; }
public int GetAmount()
{
return UnitPrice * Quantity;
}
}

実行結果:

商品名:ノート
金額:900円

GetAmount メソッドは、int 型の値を返します。

public int GetAmount()

表示用の文字列を作るメソッドを作成します。

using System;
class Program
{
static void Main()
{
Employee employee = new Employee
{
EmployeeId = 1001,
Name = "山田太郎",
Department = "営業部"
};
string text = employee.GetDisplayText();
Console.WriteLine(text);
}
}
class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; } = "";
public string Department { get; set; } = "";
public string GetDisplayText()
{
return $"{EmployeeId}{Name}{Department}";
}
}

実行結果:

1001:山田太郎(営業部)

このように、メソッドは文字列を返すこともできます。


条件判定の結果を bool 型で返すメソッドもよく使います。

次の例では、点数が合格点以上かどうかを判定します。

using System;
class Program
{
static void Main()
{
TestResult result = new TestResult
{
Name = "山田太郎",
Score = 75
};
if (result.IsPassed())
{
Console.WriteLine("合格です。");
}
else
{
Console.WriteLine("不合格です。");
}
}
}
class TestResult
{
public string Name { get; set; } = "";
public int Score { get; set; }
public bool IsPassed()
{
return Score >= 60;
}
}

実行結果:

合格です。

IsPassed メソッドは、判定結果を true または false で返します。


メソッドは、自作クラスのオブジェクトを返すこともできます。

次の例では、EmployeeFactory クラスのメソッドが Employee オブジェクトを作成して返します。

using System;
class Program
{
static void Main()
{
Employee employee = EmployeeFactory.CreateSampleEmployee();
Console.WriteLine(employee.GetDisplayText());
}
}
class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; } = "";
public string Department { get; set; } = "";
public string GetDisplayText()
{
return $"{EmployeeId}{Name}{Department}";
}
}
static class EmployeeFactory
{
public static Employee CreateSampleEmployee()
{
Employee employee = new Employee
{
EmployeeId = 1001,
Name = "山田太郎",
Department = "営業部"
};
return employee;
}
}

実行結果:

1001:山田太郎(営業部)

戻り値の型に注目してください。

public static Employee CreateSampleEmployee()

このメソッドは、Employee 型のオブジェクトを返します。


戻り値の型とreturnの値を合わせる

Section titled “戻り値の型とreturnの値を合わせる”

メソッドの戻り値の型と、return する値の型は一致している必要があります。

正しい例:

public int GetAmount()
{
return 900;
}

エラーになる例:

public int GetAmount()
{
return "900";
}

GetAmountint 型を返すメソッドなのに、"900" という文字列を返そうとしているためエラーになります。


10-2 メソッドのオーバーロード

Section titled “10-2 メソッドのオーバーロード”

メソッドのオーバーロードとは、同じ名前で、引数の数や型が異なるメソッドを複数定義することです。

たとえば、Console.WriteLine はいろいろな値を表示できます。

Console.WriteLine("こんにちは");
Console.WriteLine(100);
Console.WriteLine(true);

同じ WriteLine という名前でも、文字列、数値、真偽値など、さまざまな型を受け取れます。

これは、WriteLine がオーバーロードされているためです。


次の例では、社員検索用のメソッドをオーバーロードします。

using System;
class Program
{
static void Main()
{
EmployeeSearchService service = new EmployeeSearchService();
service.Search(1001);
service.Search("山田");
}
}
class EmployeeSearchService
{
public void Search(int employeeId)
{
Console.WriteLine($"社員番号 {employeeId} で検索します。");
}
public void Search(string name)
{
Console.WriteLine($"氏名 {name} で検索します。");
}
}

実行結果:

社員番号 1001 で検索します。
氏名 山田 で検索します。

どちらも Search という名前ですが、引数の型が違います。

Search(int employeeId)
Search(string name)

引数の数が違うオーバーロード

Section titled “引数の数が違うオーバーロード”

引数の数が違う場合も、オーバーロードできます。

using System;
class Program
{
static void Main()
{
ReportPrinter printer = new ReportPrinter();
printer.Print("売上レポート");
printer.Print("売上レポート", "2026/05/18");
}
}
class ReportPrinter
{
public void Print(string title)
{
Console.WriteLine($"タイトル:{title}");
}
public void Print(string title, string date)
{
Console.WriteLine($"タイトル:{title}");
Console.WriteLine($"日付:{date}");
}
}

実行結果:

タイトル:売上レポート
タイトル:売上レポート
日付:2026/05/18

戻り値の型だけが違うメソッドは、オーバーロードできません。

次のコードはエラーになります。

public int GetValue()
{
return 100;
}
public string GetValue()
{
return "100";
}

C#では、呼び出すときに戻り値だけではどちらのメソッドを使うか判断できないためです。

オーバーロードできるかどうかは、主に メソッド名と引数 で決まります。


オーバーロードは、同じ目的の処理を、異なる入力で使いたい場合に便利です。

例:

社員番号で検索する
氏名で検索する
日付なしでレポートを表示する
日付付きでレポートを表示する
単価と数量から金額を計算する
単価、数量、割引額から金額を計算する

ただし、何でも同じ名前にすればよいわけではありません。

処理の意味が大きく違う場合は、別のメソッド名にした方が分かりやすくなります。


10-3 メソッドの省略可能な引数

Section titled “10-3 メソッドの省略可能な引数”

省略可能な引数とは、メソッドを呼び出すときに省略できる引数です。

引数にあらかじめ既定値を設定しておくことで、呼び出し時に値を省略できます。


次の例では、敬称を省略可能な引数にします。

using System;
class Program
{
static void Main()
{
GreetingService service = new GreetingService();
string message1 = service.CreateMessage("山田太郎", "先生");
string message2 = service.CreateMessage("佐藤花子");
Console.WriteLine(message1);
Console.WriteLine(message2);
}
}
class GreetingService
{
public string CreateMessage(string name, string title = "さん")
{
return $"{name}{title}、こんにちは。";
}
}

実行結果:

山田太郎先生、こんにちは。
佐藤花子さん、こんにちは。

title には、既定値として "さん" が設定されています。

public string CreateMessage(string name, string title = "さん")

そのため、次のように第2引数を省略できます。

service.CreateMessage("佐藤花子");

金額計算で省略可能な引数を使う

Section titled “金額計算で省略可能な引数を使う”

次の例では、割引額を省略可能にします。

using System;
class Program
{
static void Main()
{
PriceCalculator calculator = new PriceCalculator();
int amount1 = calculator.GetPaymentAmount(1000, 3, 500);
int amount2 = calculator.GetPaymentAmount(1000, 3);
Console.WriteLine($"割引あり:{amount1}");
Console.WriteLine($"割引なし:{amount2}");
}
}
class PriceCalculator
{
public int GetPaymentAmount(int unitPrice, int quantity, int discount = 0)
{
return unitPrice * quantity - discount;
}
}

実行結果:

割引あり:2500円
割引なし:3000円

discount の既定値は 0 です。

割引がない場合は、引数を省略できます。


省略可能な引数は、基本的に通常の引数の後ろに書きます。

正しい例:

public int GetPaymentAmount(int unitPrice, int quantity, int discount = 0)

エラーになる例:

public int GetPaymentAmount(int discount = 0, int unitPrice, int quantity)

省略可能な引数を前に置くと、呼び出し時にどの引数を省略したのか分かりにくくなるためです。


省略可能な引数と組み合わせて、名前付き引数を使うこともできます。

using System;
class Program
{
static void Main()
{
ReportService service = new ReportService();
service.PrintReport("売上レポート", includeDate: true);
}
}
class ReportService
{
public void PrintReport(string title, bool includeDate = false)
{
Console.WriteLine($"タイトル:{title}");
if (includeDate)
{
Console.WriteLine($"作成日:{DateTime.Today.ToString("yyyy/MM/dd")}");
}
}
}

実行結果例:

タイトル:売上レポート
作成日:2026/05/18

includeDate: true のように、引数名を指定して値を渡しています。


省略可能な引数は便利ですが、使いすぎるとメソッドの呼び出し方が分かりにくくなることがあります。

この章では、次のように考えておきましょう。

省略しても自然な値がある場合
→ 省略可能な引数が向いている
省略すると意味が分からなくなる値
→ 通常の引数にする

例:

敬称の既定値を「さん」にする
割引額の既定値を0にする
日付表示の有無をfalseにする

このような場合は、省略可能な引数が使いやすいです。


10-4 コンストラクターを使いこなす

Section titled “10-4 コンストラクターを使いこなす”

コンストラクターとは、オブジェクトを作成するときに自動的に呼び出される特別なメソッドです。

次のコードで new Employee() を実行したとき、Employee クラスのコンストラクターが呼び出されます。

Employee employee = new Employee();

コンストラクターは、主に次のような目的で使います。

オブジェクト作成時に初期値を設定する
必要な値を必ず受け取る
不完全な状態のオブジェクトを作らせない

まず、引数なしコンストラクターを作成します。

using System;
class Program
{
static void Main()
{
Employee employee = new Employee();
Console.WriteLine(employee.GetDisplayText());
}
}
class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
public string Department { get; set; }
public Employee()
{
EmployeeId = 0;
Name = "未設定";
Department = "未所属";
}
public string GetDisplayText()
{
return $"{EmployeeId}{Name}{Department}";
}
}

実行結果:

0:未設定(未所属)

コンストラクターは、クラス名と同じ名前で定義します。

public Employee()

戻り値の型は書きません。


次に、社員番号、氏名、部署を受け取るコンストラクターを作成します。

using System;
class Program
{
static void Main()
{
Employee employee = new Employee(1001, "山田太郎", "営業部");
Console.WriteLine(employee.GetDisplayText());
}
}
class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
public string Department { get; set; }
public Employee(int employeeId, string name, string department)
{
EmployeeId = employeeId;
Name = name;
Department = department;
}
public string GetDisplayText()
{
return $"{EmployeeId}{Name}{Department}";
}
}

実行結果:

1001:山田太郎(営業部)

このコンストラクターを使うと、オブジェクト作成時に必要な値をまとめて設定できます。

Employee employee = new Employee(1001, "山田太郎", "営業部");

コンストラクターを使うメリット

Section titled “コンストラクターを使うメリット”

コンストラクターを使うと、オブジェクトを作成した直後から必要な値が入った状態にできます。

コンストラクターを使わない場合:

Employee employee = new Employee();
employee.EmployeeId = 1001;
employee.Name = "山田太郎";
employee.Department = "営業部";

コンストラクターを使う場合:

Employee employee = new Employee(1001, "山田太郎", "営業部");

値の設定忘れを減らしやすくなります。


コンストラクターのオーバーロード

Section titled “コンストラクターのオーバーロード”

コンストラクターも、メソッドと同じようにオーバーロードできます。

using System;
class Program
{
static void Main()
{
Employee employee1 = new Employee();
Employee employee2 = new Employee(1001, "山田太郎", "営業部");
Console.WriteLine(employee1.GetDisplayText());
Console.WriteLine(employee2.GetDisplayText());
}
}
class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
public string Department { get; set; }
public Employee()
{
EmployeeId = 0;
Name = "未設定";
Department = "未所属";
}
public Employee(int employeeId, string name, string department)
{
EmployeeId = employeeId;
Name = name;
Department = department;
}
public string GetDisplayText()
{
return $"{EmployeeId}{Name}{Department}";
}
}

実行結果:

0:未設定(未所属)
1001:山田太郎(営業部)

引数なしでも作れるようにしつつ、引数ありで初期値を設定することもできます。


コンストラクターから別のコンストラクターを呼び出す

Section titled “コンストラクターから別のコンストラクターを呼び出す”

コンストラクターの処理が重複する場合、別のコンストラクターを呼び出すことができます。

using System;
class Program
{
static void Main()
{
Employee employee1 = new Employee();
Employee employee2 = new Employee(1001, "山田太郎", "営業部");
Console.WriteLine(employee1.GetDisplayText());
Console.WriteLine(employee2.GetDisplayText());
}
}
class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
public string Department { get; set; }
public Employee() : this(0, "未設定", "未所属")
{
}
public Employee(int employeeId, string name, string department)
{
EmployeeId = employeeId;
Name = name;
Department = department;
}
public string GetDisplayText()
{
return $"{EmployeeId}{Name}{Department}";
}
}

this(0, "未設定", "未所属") は、同じクラスの別のコンストラクターを呼び出しています。

このように書くと、初期化処理を1か所にまとめやすくなります。


コンストラクターで不正な値を補正する

Section titled “コンストラクターで不正な値を補正する”

コンストラクターでは、受け取った値をそのまま代入するだけでなく、簡単な確認を行うこともできます。

using System;
class Program
{
static void Main()
{
Product product = new Product("ノート", -180);
Console.WriteLine(product.GetDisplayText());
}
}
class Product
{
public string Name { get; set; }
public int Price { get; set; }
public Product(string name, int price)
{
Name = name;
if (price < 0)
{
Price = 0;
}
else
{
Price = price;
}
}
public string GetDisplayText()
{
return $"{Name}{Price}";
}
}

実行結果:

ノート:0円

このように、オブジェクト作成時に不正な値を補正できます。

ただし、本格的な入力チェックやエラー通知は、後の例外処理でも扱います。


10-5 プロパティの高度な使い方

Section titled “10-5 プロパティの高度な使い方”

これまでよく使ってきた次のプロパティは、自動実装プロパティと呼ばれます。

public string Name { get; set; }

これは、値を取得する get と、値を設定する set を自動的に用意する書き方です。

単純に値を持たせるだけなら、この書き方で十分です。


値を取得するときや設定するときに処理を加えたい場合は、getset を明示して書きます。

次の例では、点数が0未満なら0、100を超えるなら100に補正します。

using System;
class Program
{
static void Main()
{
TestResult result = new TestResult();
result.Score = 120;
Console.WriteLine($"点数:{result.Score}");
}
}
class TestResult
{
private int _score;
public int Score
{
get
{
return _score;
}
set
{
if (value < 0)
{
_score = 0;
}
else if (value > 100)
{
_score = 100;
}
else
{
_score = value;
}
}
}
}

実行結果:

点数:100

Score120 を代入しましたが、set の中で100に補正されています。


次の変数に注目してください。

private int _score;

このように、プロパティの値を内部で保持するための変数を、バッキングフィールドと呼ぶことがあります。

public int Score
{
get
{
return _score;
}
set
{
_score = value;
}
}

この章では、次のように理解してください。

外から見える窓口
→ プロパティ
内部で実際に値を持つ変数
→ フィールド

set の中で使われている value は、プロパティに代入された値を表します。

result.Score = 120;

このとき、set の中では value120 になります。

set
{
if (value > 100)
{
_score = 100;
}
}

プロパティは、外から参照だけできるようにすることもできます。

次の例では、FullName を読み取り専用プロパティとして定義します。

using System;
class Program
{
static void Main()
{
Person person = new Person
{
LastName = "山田",
FirstName = "太郎"
};
Console.WriteLine(person.FullName);
}
}
class Person
{
public string LastName { get; set; } = "";
public string FirstName { get; set; } = "";
public string FullName
{
get
{
return LastName + FirstName;
}
}
}

実行結果:

山田太郎

FullName は、LastNameFirstName から計算される値です。

外から直接代入する必要はありません。

エラーになる例:

person.FullName = "佐藤花子";

FullName には set がないため、外から代入できません。


private set を使うと、外からは読み取りだけでき、クラスの中からは値を変更できるプロパティを作れます。

using System;
class Program
{
static void Main()
{
Employee employee = new Employee(1001, "山田太郎", "営業部");
Console.WriteLine(employee.EmployeeId);
Console.WriteLine(employee.Name);
Console.WriteLine(employee.Department);
employee.ChangeDepartment("開発部");
Console.WriteLine(employee.Department);
}
}
class Employee
{
public int EmployeeId { get; private set; }
public string Name { get; private set; }
public string Department { get; private set; }
public Employee(int employeeId, string name, string department)
{
EmployeeId = employeeId;
Name = name;
Department = department;
}
public void ChangeDepartment(string newDepartment)
{
Department = newDepartment;
}
}

実行結果:

1001
山田太郎
営業部
開発部

EmployeeIdNameDepartment は外から参照できます。

しかし、外から直接代入することはできません。

エラーになる例:

employee.Name = "佐藤花子";

Namesetprivate なので、クラスの外から変更できません。

部署を変更したい場合は、用意されたメソッドを使います。

employee.ChangeDepartment("開発部");

このように、変更方法をメソッドに限定すると、意図しない変更を防ぎやすくなります。


プロパティには、初期値を設定できます。

class TrainingStatus
{
public string Name { get; set; } = "未設定";
public int ProgressRate { get; set; } = 0;
public bool IsCompleted { get; set; } = false;
}

次のコードを実行して確認します。

using System;
class Program
{
static void Main()
{
TrainingStatus status = new TrainingStatus();
Console.WriteLine(status.Name);
Console.WriteLine(status.ProgressRate);
Console.WriteLine(status.IsCompleted);
}
}
class TrainingStatus
{
public string Name { get; set; } = "未設定";
public int ProgressRate { get; set; } = 0;
public bool IsCompleted { get; set; } = false;
}

実行結果:

未設定
0
False

プロパティの初期化を使うと、コンストラクターに書かなくても初期値を持たせられます。


ここまでで、次のような書き方を学びました。

public int Score
{
get
{
return _score;
}
set
{
if (value < 0)
{
_score = 0;
}
else if (value > 100)
{
_score = 100;
}
else
{
_score = value;
}
}
}
public string Name { get; private set; }

これらは、外から自由に値を書き換えられないようにしたり、不正な値を防いだりするための工夫です。

オブジェクトの内部状態を守り、必要な操作だけを外に公開する考え方を カプセル化 といいます。

この章では、次のように理解しておきましょう。

外から直接変更させたくない値は制限する
変更が必要な場合は、メソッドを通して変更させる
不正な値が入らないようにプロパティで確認する

本格的なカプセル化は、今後の章や開発演習でさらに意識していきます。


この章でよくあるつまずきを確認します。

つまずき原因対応
return の型が合わないメソッドの戻り値の型と返す値が違うメソッド名の前に書いた型を確認する
オーバーロードできない引数が同じで戻り値だけ違うオーバーロードは引数の数や型を変える
省略可能な引数でエラーになる省略可能な引数を前に置いている省略可能な引数は後ろに置く
コンストラクターに戻り値を書いてしまう通常のメソッドと混同しているコンストラクターには戻り値の型を書かない
コンストラクター名を間違えるクラス名と一致していないコンストラクター名はクラス名と同じ
new Employee() が使えない引数なしコンストラクターが定義されていない必要なら引数なしコンストラクターを追加する
value の意味が分からないsetアクセサーの仕組みに慣れていない代入された値が value に入る
private set のプロパティに代入できない外部からの変更が制限されているコンストラクターや専用メソッドで変更する
読み取り専用プロパティに代入しようとするset がない計算結果や参照専用の値として使う

次の項目について、自分で説明できるか確認してください。

  • メソッドの戻り値とは何かを説明できる
  • int 型を返すメソッドを作成できる
  • string 型を返すメソッドを作成できる
  • bool 型を返すメソッドを作成できる
  • 自作クラスを返すメソッドを読める
  • メソッドのオーバーロードを説明できる
  • 引数の数や型を変えてオーバーロードできる
  • 省略可能な引数を持つメソッドを定義できる
  • コンストラクターの役割を説明できる
  • 引数付きコンストラクターを作成できる
  • コンストラクターのオーバーロードを使える
  • get / set を明示したプロパティを読める
  • value の役割を説明できる
  • 読み取り専用プロパティを作成できる
  • private set の意味を説明できる
  • プロパティの初期値を設定できる

研修の進め方によっては、隣の人またはチーム内で説明確認を行います。

次の内容を、自分の言葉で説明してください。

  1. 戻り値のあるメソッドと void メソッドの違いは何ですか。
  2. メソッドのオーバーロードとは何ですか。
  3. 省略可能な引数はどのようなときに便利ですか。
  4. コンストラクターはいつ呼び出されますか。
  5. 引数付きコンストラクターを使うメリットは何ですか。
  6. getset は何をするものですか。
  7. private set はどのようなときに使いますか。
  8. カプセル化とは、ひとまずどのような考え方ですか。

説明するときは、完全な答えでなくても構いません。
自分の言葉で説明しようとすることが大切です。


この章の演習課題に取り組みます。

制限時間は 75分 です。

時間内にすべて完成しなくても構いません。
できたところまでを保存し、Gitに提出してください。

提出について

制限時間になったら、完成・未完成に関わらず作業を止めます。 できたところまでをGitにcommitし、pushしてください。 未完成の場合は、どこまでできたかを報告できるようにしておきましょう。


まずは、全員が必須課題に取り組んでください。


課題10-1 bool型を返すメソッドを作成する

Section titled “課題10-1 bool型を返すメソッドを作成する”

TestResult クラスを作成し、点数が60点以上なら true、60点未満なら false を返す IsPassed メソッドを作成してください。

プロパティ:

プロパティ名意味
Namestring氏名
Scoreint点数

実行結果例:

山田太郎:合格

条件:

  • bool 型を返す IsPassed メソッドを作成する
  • if 文で判定結果を表示する

課題10-2 メソッドをオーバーロードする

Section titled “課題10-2 メソッドをオーバーロードする”

EmployeeSearchService クラスを作成し、次の2つの Search メソッドを定義してください。

メソッド処理
Search(int employeeId)社員番号で検索するメッセージを表示
Search(string name)氏名で検索するメッセージを表示

実行結果例:

社員番号 1001 で検索します。
氏名 山田 で検索します。

条件:

  • 同じ Search という名前で定義する
  • 引数の型を変える

課題10-3 省略可能な引数を使う

Section titled “課題10-3 省略可能な引数を使う”

GreetingService クラスを作成し、敬称付きのあいさつ文を返す CreateMessage メソッドを作成してください。

仕様:

public string CreateMessage(string name, string title = "さん")

実行結果例:

山田太郎先生、こんにちは。
佐藤花子さん、こんにちは。

条件:

  • title の既定値を "さん" にする
  • 引数を省略した場合と、省略しない場合の両方を確認する

課題10-4 引数付きコンストラクターを作成する

Section titled “課題10-4 引数付きコンストラクターを作成する”

Employee クラスに、社員番号、氏名、部署を受け取るコンストラクターを作成してください。

実行結果例:

1001:山田太郎(営業部)

条件:

  • 引数付きコンストラクターを作成する
  • GetDisplayText メソッドを作成する
  • new Employee(1001, "山田太郎", "営業部") のように生成する

必須課題が終わった人は、発展課題に取り組んでください。


課題10-5 コンストラクターをオーバーロードする

Section titled “課題10-5 コンストラクターをオーバーロードする”

Employee クラスに、次の2つのコンストラクターを作成してください。

コンストラクター初期値
Employee()社員番号 0、氏名 "未設定"、部署 "未所属"
Employee(int employeeId, string name, string department)引数の値を設定

実行結果例:

0:未設定(未所属)
1001:山田太郎(営業部)

条件:

  • コンストラクターをオーバーロードする
  • 可能であれば this(...) を使って初期化処理をまとめる

課題10-6 点数プロパティで範囲チェックする

Section titled “課題10-6 点数プロパティで範囲チェックする”

TestResult クラスに、0から100の範囲に補正される Score プロパティを作成してください。

仕様:

入力値実際に保存される値
120100
-100
7575

実行結果例:

120を代入した結果:100
-10を代入した結果:0
75を代入した結果:75

条件:

  • private int _score; を使う
  • getset を明示して書く
  • value を使う

課題10-7 読み取り専用プロパティを作成する

Section titled “課題10-7 読み取り専用プロパティを作成する”

Person クラスを作成し、LastNameFirstNameFullName を定義してください。

仕様:

プロパティ名内容
LastName
FirstName
FullName姓 + 名を返す読み取り専用プロパティ

実行結果例:

山田太郎

条件:

  • FullName には set を書かない
  • FullNameLastName + FirstName を返す

Product クラスを作成し、商品名と価格を管理してください。

仕様:

プロパティ名条件
Namestring外から変更できない
Priceint外から直接変更できない

コンストラクターで初期値を設定し、価格変更は ChangePrice メソッドを通して行います。

実行結果例:

ノート:180円
ノート:200円

条件:

  • private set を使う
  • 引数付きコンストラクターを使う
  • ChangePrice メソッドを作成する
  • 価格が0未満の場合は0に補正する

課題10-9 OrderItemクラスを作成する

Section titled “課題10-9 OrderItemクラスを作成する”

注文商品を表す OrderItem クラスを作成してください。

プロパティ:

プロパティ名条件
ProductNamestringコンストラクターで設定
UnitPriceint0未満なら0に補正
Quantityint1未満なら1に補正
Amountint単価 × 数量を返す読み取り専用プロパティ

実行結果例:

商品名:ノート
単価:180円
数量:5個
金額:900円

条件:

  • 引数付きコンストラクターを使う
  • Amount は読み取り専用プロパティにする
  • UnitPriceQuantity は不正値を補正する

課題が終わったら、できたところまでをGitに提出します。

まず、現在の状態を確認します。

Terminal window
git status

変更されたファイルを追加します。

Terminal window
git add .

コミットします。

Terminal window
git commit -m "Chapter10 クラスについて掘り下げる"

ファイルサーバー上のリポジトリへpushします。

Terminal window
git push

Gitの操作でエラーが出た場合は、自己判断で同じ操作を繰り返さず、講師に確認してください。


提出前に、次の項目を確認してください。

  • 戻り値のあるメソッドを作成できている
  • return する値の型が戻り値の型と合っている
  • メソッドのオーバーロードを使っている
  • 省略可能な引数を使っている
  • コンストラクターを作成できている
  • 引数付きコンストラクターを使っている
  • コンストラクター名がクラス名と一致している
  • コンストラクターに戻り値の型を書いていない
  • get / set を使ったプロパティを書けている
  • value の意味を理解している
  • 読み取り専用プロパティを使っている
  • private set を使っている
  • インデントが整っている
  • Gitにcommitしている
  • Gitにpushしている

この章では、クラスについてさらに掘り下げました。

この章で学んだ主な内容は次の通りです。

  • メソッドは、intstringbool、自作クラスなど、さまざまな型を返せる
  • 戻り値の型と return する値の型は一致している必要がある
  • 同じ名前で引数の数や型が異なるメソッドを定義できる
  • これをメソッドのオーバーロードという
  • 省略可能な引数を使うと、引数を省略してメソッドを呼び出せる
  • コンストラクターは、オブジェクト作成時に自動的に呼び出される
  • コンストラクターは、初期値の設定や必要な値の受け取りに使う
  • コンストラクターもオーバーロードできる
  • get / set を明示すると、プロパティに処理を加えられる
  • set の中では、代入された値を value で受け取る
  • 読み取り専用プロパティは、外から値を参照できるが代入できない
  • private set を使うと、外から直接変更できないプロパティを作れる
  • 外から自由に変更させず、必要な操作だけを公開する考え方はカプセル化につながる

次章では、値型と参照型 を学習します。

これまで、intboolstring、配列、クラスなど、さまざまな型を使ってきました。
次章では、それらの型がメモリ上でどのように扱われるかを意識しながら、値型、参照型、構造体、列挙型、null について学習します。