第10章 クラスについて掘り下げる
この章の目的
Section titled “この章の目的”この章では、第7章から学習してきたクラスについて、さらに実践的な使い方を学習します。
第7章では、クラス、オブジェクト、プロパティ、メソッドの基本を学習しました。
Employee employee = new Employee();
employee.EmployeeId = 1001;employee.Name = "山田太郎";employee.Department = "営業部";
employee.PrintProfile();第8章では、static を使った静的メソッドや静的クラスを学習しました。
第9章では、String、Math、DateTime、File など、.NETに用意されているクラスを利用しました。
この章では、自分で作るクラスをより使いやすく、より安全にするために、次の内容を学習します。
メソッドの戻り値メソッドのオーバーロード省略可能な引数コンストラクタープロパティのget / set読み取り専用プロパティprivate setプロパティの初期化これらは、実際のC#開発でよく使われます。
特に、コンストラクターやプロパティの制御は、オブジェクト指向プログラミングで重要になる カプセル化 の考え方にもつながります。
ただし、この章では難しく考えすぎず、まずは次のように理解することを目指します。
オブジェクトを作るときに必要な値を設定する不正な値が入らないようにする外から変更してよい値と、変更させたくない値を分けるクラスを使う側が分かりやすく使えるようにするこの章でできるようになること
Section titled “この章でできるようになること”この章を終えると、次のことができるようになります。
- メソッドは
int、string、bool、自作クラスなど、さまざまな型を返せることを説明できる - 戻り値のあるメソッドを定義できる
- 同じ名前で引数の異なるメソッドを定義できる
- メソッドのオーバーロードを説明できる
- 省略可能な引数を持つメソッドを定義できる
- コンストラクターの役割を説明できる
- 引数なしコンストラクターを作成できる
- 引数付きコンストラクターを作成できる
- コンストラクターのオーバーロードを使える
get/setを使ったプロパティを定義できる- プロパティに値のチェック処理を入れられる
- 読み取り専用プロパティを作成できる
private setを使って、外部からの変更を制限できる- プロパティの初期値を設定できる
本章で使用する環境
Section titled “本章で使用する環境”| 項目 | 内容 |
|---|---|
| 開発環境 | Visual Studio 2022 |
| プロジェクト種類 | コンソール アプリ |
| 対象フレームワーク | .NET 8 |
| プロジェクト名 | Chapter10_ClassDetails |
作業前チェック
Section titled “作業前チェック”作業を始める前に、次の内容を確認してください。
- クラスを作成できる
- プロパティを定義できる
- メソッドを定義できる
-
newを使ってオブジェクトを作成できる - 戻り値のあるメソッドを呼び出せる
- 引数のあるメソッドを作成できる
- 静的メソッドとインスタンスメソッドの違いをおおまかに説明できる
- 第9章の内容をGitに提出済みである
10-1 メソッドはどんな型でも返せる
Section titled “10-1 メソッドはどんな型でも返せる”メソッドは、処理を実行するだけでなく、結果を呼び出し元に返すことができます。
この返される値を 戻り値 といいます。
第7章では、社員情報を文字列として返すメソッドを作成しました。
public string GetProfileText(){ return $"{EmployeeId}:{Name}({Department})";}このメソッドは、string 型の値を返します。
string profileText = employee.GetProfileText();int型を返すメソッド
Section titled “int型を返すメソッド”まず、売上金額を計算して 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()string型を返すメソッド
Section titled “string型を返すメソッド”表示用の文字列を作るメソッドを作成します。
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型を返すメソッド
Section titled “bool型を返すメソッド”条件判定の結果を 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 で返します。
自作クラスを返すメソッド
Section titled “自作クラスを返すメソッド”メソッドは、自作クラスのオブジェクトを返すこともできます。
次の例では、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";}GetAmount は int 型を返すメソッドなのに、"900" という文字列を返そうとしているためエラーになります。
10-2 メソッドのオーバーロード
Section titled “10-2 メソッドのオーバーロード”オーバーロードとは
Section titled “オーバーロードとは”メソッドのオーバーロードとは、同じ名前で、引数の数や型が異なるメソッドを複数定義することです。
たとえば、Console.WriteLine はいろいろな値を表示できます。
Console.WriteLine("こんにちは");Console.WriteLine(100);Console.WriteLine(true);同じ WriteLine という名前でも、文字列、数値、真偽値など、さまざまな型を受け取れます。
これは、WriteLine がオーバーロードされているためです。
自分でオーバーロードを作る
Section titled “自分でオーバーロードを作る”次の例では、社員検索用のメソッドをオーバーロードします。
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オーバーロードできない例
Section titled “オーバーロードできない例”戻り値の型だけが違うメソッドは、オーバーロードできません。
次のコードはエラーになります。
public int GetValue(){ return 100;}
public string GetValue(){ return "100";}C#では、呼び出すときに戻り値だけではどちらのメソッドを使うか判断できないためです。
オーバーロードできるかどうかは、主に メソッド名と引数 で決まります。
オーバーロードの使いどころ
Section titled “オーバーロードの使いどころ”オーバーロードは、同じ目的の処理を、異なる入力で使いたい場合に便利です。
例:
社員番号で検索する氏名で検索する
日付なしでレポートを表示する日付付きでレポートを表示する
単価と数量から金額を計算する単価、数量、割引額から金額を計算するただし、何でも同じ名前にすればよいわけではありません。
処理の意味が大きく違う場合は、別のメソッド名にした方が分かりやすくなります。
10-3 メソッドの省略可能な引数
Section titled “10-3 メソッドの省略可能な引数”省略可能な引数とは
Section titled “省略可能な引数とは”省略可能な引数とは、メソッドを呼び出すときに省略できる引数です。
引数にあらかじめ既定値を設定しておくことで、呼び出し時に値を省略できます。
あいさつ文を作る例
Section titled “あいさつ文を作る例”次の例では、敬称を省略可能な引数にします。
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 です。
割引がない場合は、引数を省略できます。
省略可能な引数を書く位置
Section titled “省略可能な引数を書く位置”省略可能な引数は、基本的に通常の引数の後ろに書きます。
正しい例:
public int GetPaymentAmount(int unitPrice, int quantity, int discount = 0)エラーになる例:
public int GetPaymentAmount(int discount = 0, int unitPrice, int quantity)省略可能な引数を前に置くと、呼び出し時にどの引数を省略したのか分かりにくくなるためです。
名前付き引数
Section titled “名前付き引数”省略可能な引数と組み合わせて、名前付き引数を使うこともできます。
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/18includeDate: true のように、引数名を指定して値を渡しています。
使いすぎに注意する
Section titled “使いすぎに注意する”省略可能な引数は便利ですが、使いすぎるとメソッドの呼び出し方が分かりにくくなることがあります。
この章では、次のように考えておきましょう。
省略しても自然な値がある場合 → 省略可能な引数が向いている
省略すると意味が分からなくなる値 → 通常の引数にする例:
敬称の既定値を「さん」にする割引額の既定値を0にする日付表示の有無をfalseにするこのような場合は、省略可能な引数が使いやすいです。
10-4 コンストラクターを使いこなす
Section titled “10-4 コンストラクターを使いこなす”コンストラクターとは
Section titled “コンストラクターとは”コンストラクターとは、オブジェクトを作成するときに自動的に呼び出される特別なメソッドです。
次のコードで new Employee() を実行したとき、Employee クラスのコンストラクターが呼び出されます。
Employee employee = new Employee();コンストラクターは、主に次のような目的で使います。
オブジェクト作成時に初期値を設定する必要な値を必ず受け取る不完全な状態のオブジェクトを作らせない引数なしコンストラクター
Section titled “引数なしコンストラクター”まず、引数なしコンストラクターを作成します。
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()戻り値の型は書きません。
引数付きコンストラクター
Section titled “引数付きコンストラクター”次に、社員番号、氏名、部署を受け取るコンストラクターを作成します。
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 プロパティの高度な使い方”自動実装プロパティ
Section titled “自動実装プロパティ”これまでよく使ってきた次のプロパティは、自動実装プロパティと呼ばれます。
public string Name { get; set; }これは、値を取得する get と、値を設定する set を自動的に用意する書き方です。
単純に値を持たせるだけなら、この書き方で十分です。
get / set を明示して書く
Section titled “get / set を明示して書く”値を取得するときや設定するときに処理を加えたい場合は、get と set を明示して書きます。
次の例では、点数が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; } } }}実行結果:
点数:100Score に 120 を代入しましたが、set の中で100に補正されています。
バッキングフィールド
Section titled “バッキングフィールド”次の変数に注目してください。
private int _score;このように、プロパティの値を内部で保持するための変数を、バッキングフィールドと呼ぶことがあります。
public int Score{ get { return _score; } set { _score = value; }}この章では、次のように理解してください。
外から見える窓口 → プロパティ
内部で実際に値を持つ変数 → フィールドvalueとは
Section titled “valueとは”set の中で使われている value は、プロパティに代入された値を表します。
result.Score = 120;このとき、set の中では value が 120 になります。
set{ if (value > 100) { _score = 100; }}読み取り専用プロパティ
Section titled “読み取り専用プロパティ”プロパティは、外から参照だけできるようにすることもできます。
次の例では、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 は、LastName と FirstName から計算される値です。
外から直接代入する必要はありません。
エラーになる例:
person.FullName = "佐藤花子";FullName には set がないため、外から代入できません。
private set
Section titled “private 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山田太郎営業部開発部EmployeeId、Name、Department は外から参照できます。
しかし、外から直接代入することはできません。
エラーになる例:
employee.Name = "佐藤花子";Name の set が private なので、クラスの外から変更できません。
部署を変更したい場合は、用意されたメソッドを使います。
employee.ChangeDepartment("開発部");このように、変更方法をメソッドに限定すると、意図しない変更を防ぎやすくなります。
プロパティの初期化
Section titled “プロパティの初期化”プロパティには、初期値を設定できます。
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;}実行結果:
未設定0Falseプロパティの初期化を使うと、コンストラクターに書かなくても初期値を持たせられます。
カプセル化につながる考え方
Section titled “カプセル化につながる考え方”ここまでで、次のような書き方を学びました。
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; }これらは、外から自由に値を書き換えられないようにしたり、不正な値を防いだりするための工夫です。
オブジェクトの内部状態を守り、必要な操作だけを外に公開する考え方を カプセル化 といいます。
この章では、次のように理解しておきましょう。
外から直接変更させたくない値は制限する変更が必要な場合は、メソッドを通して変更させる不正な値が入らないようにプロパティで確認する本格的なカプセル化は、今後の章や開発演習でさらに意識していきます。
よくあるつまずき
Section titled “よくあるつまずき”この章でよくあるつまずきを確認します。
| つまずき | 原因 | 対応 |
|---|---|---|
return の型が合わない | メソッドの戻り値の型と返す値が違う | メソッド名の前に書いた型を確認する |
| オーバーロードできない | 引数が同じで戻り値だけ違う | オーバーロードは引数の数や型を変える |
| 省略可能な引数でエラーになる | 省略可能な引数を前に置いている | 省略可能な引数は後ろに置く |
| コンストラクターに戻り値を書いてしまう | 通常のメソッドと混同している | コンストラクターには戻り値の型を書かない |
| コンストラクター名を間違える | クラス名と一致していない | コンストラクター名はクラス名と同じ |
new Employee() が使えない | 引数なしコンストラクターが定義されていない | 必要なら引数なしコンストラクターを追加する |
value の意味が分からない | setアクセサーの仕組みに慣れていない | 代入された値が value に入る |
private set のプロパティに代入できない | 外部からの変更が制限されている | コンストラクターや専用メソッドで変更する |
| 読み取り専用プロパティに代入しようとする | set がない | 計算結果や参照専用の値として使う |
学んだことチェック
Section titled “学んだことチェック”次の項目について、自分で説明できるか確認してください。
- メソッドの戻り値とは何かを説明できる
-
int型を返すメソッドを作成できる -
string型を返すメソッドを作成できる -
bool型を返すメソッドを作成できる - 自作クラスを返すメソッドを読める
- メソッドのオーバーロードを説明できる
- 引数の数や型を変えてオーバーロードできる
- 省略可能な引数を持つメソッドを定義できる
- コンストラクターの役割を説明できる
- 引数付きコンストラクターを作成できる
- コンストラクターのオーバーロードを使える
-
get/setを明示したプロパティを読める -
valueの役割を説明できる - 読み取り専用プロパティを作成できる
-
private setの意味を説明できる - プロパティの初期値を設定できる
研修の進め方によっては、隣の人またはチーム内で説明確認を行います。
次の内容を、自分の言葉で説明してください。
- 戻り値のあるメソッドと
voidメソッドの違いは何ですか。 - メソッドのオーバーロードとは何ですか。
- 省略可能な引数はどのようなときに便利ですか。
- コンストラクターはいつ呼び出されますか。
- 引数付きコンストラクターを使うメリットは何ですか。
getとsetは何をするものですか。private setはどのようなときに使いますか。- カプセル化とは、ひとまずどのような考え方ですか。
説明するときは、完全な答えでなくても構いません。
自分の言葉で説明しようとすることが大切です。
この章の演習課題に取り組みます。
制限時間は 75分 です。
時間内にすべて完成しなくても構いません。
できたところまでを保存し、Gitに提出してください。
提出について
制限時間になったら、完成・未完成に関わらず作業を止めます。 できたところまでをGitにcommitし、pushしてください。 未完成の場合は、どこまでできたかを報告できるようにしておきましょう。
まずは、全員が必須課題に取り組んでください。
課題10-1 bool型を返すメソッドを作成する
Section titled “課題10-1 bool型を返すメソッドを作成する”TestResult クラスを作成し、点数が60点以上なら true、60点未満なら false を返す IsPassed メソッドを作成してください。
プロパティ:
| プロパティ名 | 型 | 意味 |
|---|---|---|
Name | string | 氏名 |
Score | int | 点数 |
実行結果例:
山田太郎:合格条件:
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 プロパティを作成してください。
仕様:
| 入力値 | 実際に保存される値 |
|---|---|
120 | 100 |
-10 | 0 |
75 | 75 |
実行結果例:
120を代入した結果:100-10を代入した結果:075を代入した結果:75条件:
private int _score;を使うgetとsetを明示して書くvalueを使う
課題10-7 読み取り専用プロパティを作成する
Section titled “課題10-7 読み取り専用プロパティを作成する”Person クラスを作成し、LastName、FirstName、FullName を定義してください。
仕様:
| プロパティ名 | 内容 |
|---|---|
LastName | 姓 |
FirstName | 名 |
FullName | 姓 + 名を返す読み取り専用プロパティ |
実行結果例:
山田太郎条件:
FullNameにはsetを書かないFullNameはLastName + FirstNameを返す
課題10-8 private setを使う
Section titled “課題10-8 private setを使う”Product クラスを作成し、商品名と価格を管理してください。
仕様:
| プロパティ名 | 型 | 条件 |
|---|---|---|
Name | string | 外から変更できない |
Price | int | 外から直接変更できない |
コンストラクターで初期値を設定し、価格変更は ChangePrice メソッドを通して行います。
実行結果例:
ノート:180円ノート:200円条件:
private setを使う- 引数付きコンストラクターを使う
ChangePriceメソッドを作成する- 価格が0未満の場合は0に補正する
課題10-9 OrderItemクラスを作成する
Section titled “課題10-9 OrderItemクラスを作成する”注文商品を表す OrderItem クラスを作成してください。
プロパティ:
| プロパティ名 | 型 | 条件 |
|---|---|---|
ProductName | string | コンストラクターで設定 |
UnitPrice | int | 0未満なら0に補正 |
Quantity | int | 1未満なら1に補正 |
Amount | int | 単価 × 数量を返す読み取り専用プロパティ |
実行結果例:
商品名:ノート単価:180円数量:5個金額:900円条件:
- 引数付きコンストラクターを使う
Amountは読み取り専用プロパティにするUnitPriceとQuantityは不正値を補正する
Gitへの提出
Section titled “Gitへの提出”課題が終わったら、できたところまでをGitに提出します。
まず、現在の状態を確認します。
git status変更されたファイルを追加します。
git add .コミットします。
git commit -m "Chapter10 クラスについて掘り下げる"ファイルサーバー上のリポジトリへpushします。
git pushGitの操作でエラーが出た場合は、自己判断で同じ操作を繰り返さず、講師に確認してください。
提出前チェックリスト
Section titled “提出前チェックリスト”提出前に、次の項目を確認してください。
- 戻り値のあるメソッドを作成できている
-
returnする値の型が戻り値の型と合っている - メソッドのオーバーロードを使っている
- 省略可能な引数を使っている
- コンストラクターを作成できている
- 引数付きコンストラクターを使っている
- コンストラクター名がクラス名と一致している
- コンストラクターに戻り値の型を書いていない
-
get/setを使ったプロパティを書けている -
valueの意味を理解している - 読み取り専用プロパティを使っている
-
private setを使っている - インデントが整っている
- Gitにcommitしている
- Gitにpushしている
この章のまとめ
Section titled “この章のまとめ”この章では、クラスについてさらに掘り下げました。
この章で学んだ主な内容は次の通りです。
- メソッドは、
int、string、bool、自作クラスなど、さまざまな型を返せる - 戻り値の型と
returnする値の型は一致している必要がある - 同じ名前で引数の数や型が異なるメソッドを定義できる
- これをメソッドのオーバーロードという
- 省略可能な引数を使うと、引数を省略してメソッドを呼び出せる
- コンストラクターは、オブジェクト作成時に自動的に呼び出される
- コンストラクターは、初期値の設定や必要な値の受け取りに使う
- コンストラクターもオーバーロードできる
get/setを明示すると、プロパティに処理を加えられるsetの中では、代入された値をvalueで受け取る- 読み取り専用プロパティは、外から値を参照できるが代入できない
private setを使うと、外から直接変更できないプロパティを作れる- 外から自由に変更させず、必要な操作だけを公開する考え方はカプセル化につながる
次章では、値型と参照型 を学習します。
これまで、int や bool、string、配列、クラスなど、さまざまな型を使ってきました。
次章では、それらの型がメモリ上でどのように扱われるかを意識しながら、値型、参照型、構造体、列挙型、null について学習します。