静的クラス
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 13/70。
クラスが静的(static)メンバのみを含み、そのインスタンスを作成する必要がまったくない場合、クラス全体を static として宣言できます。これにより、コンパイラに対してそのクラスがインスタンス化できないこと、および静的メンバのみを含めることができることを伝えます。
public static class MathHelper
{
public static double Pi = 3.14159;
public static int Square(int number)
{
return number * number;
}
public static int Add(int a, int b)
{
return a + b;
}
}静的クラスは、静的メンバーと同じように、クラス名で直接呼び出すことで使用します。
int result = MathHelper.Square(5);
double pi = MathHelper.Pi;静的クラスには重要な制限があります。new を使用してインスタンスを作成することはできず、インスタンスコンストラクタを持つことも、継承することもできません。これらは静的フィールド、プロパティ、およびメソッドのみを含むことができます。
これまで使用してきた Console クラスや Math クラスは、静的クラスの完璧な例です。これらはオブジェクトの状態を必要とせずに、ユーティリティ機能を提供します。静的クラスは、インスタンス固有のデータを必要としない、関連するヘルパーメソッドや定数をグループ化するのに最適です。
チャレンジ
簡単オブジェクトの状態を必要としない、関連するヘルパーメソッドをグループ化するために、静的クラスを使用して温度変換ユーティリティを作成しましょう。
コードを整理するために、2つのファイルを作成します:
TemperatureConverter.cs:Utilities名前空間内にTemperatureConverterという名前の静的クラスを定義します。このクラスには以下を含める必要があります:-273.15に設定された静的フィールドAbsoluteZeroCelsius- 摂氏を華氏に変換する静的メソッド
CelsiusToFahrenheit(double celsius)。公式は(celsius * 9 / 5) + 32を使用します。 - 華氏を摂氏に変換する静的メソッド
FahrenheitToCelsius(double fahrenheit)。公式は(fahrenheit - 32) * 5 / 9を使用します。 - 温度が絶対零度より高い場合に
trueを返す静的メソッドIsAboveAbsoluteZero(double celsius)
Program.cs: メインファイルで、静的クラスを使用して変換を実行します。入力から摂氏の温度値を読み取り、変換結果と検証結果を表示します。
1つの入力を受け取ります:摂氏の温度値です。
結果を以下の形式で出力してください:
{celsius}C = {fahrenheit}F
{fahrenheit}F = {convertedBack}C
Above Absolute Zero: {True/False}
Absolute Zero: {AbsoluteZeroCelsius}C例えば、入力が 25 の場合、出力は以下のようになります:
25C = 77F
77F = 25C
Above Absolute Zero: True
Absolute Zero: -273.15C静的クラスはインスタンス化できないことに注意してください。TemperatureConverter.CelsiusToFahrenheit(25) のように、すべてのメソッドをクラス名で直接呼び出します。
チートシート
staticクラスは静的メンバのみを含むことができ、インスタンス化することはできません。オブジェクトの状態を必要としない、関連するユーティリティメソッドや定数をグループ化するために使用されます。
public static class MathHelper
{
public static double Pi = 3.14159;
public static int Square(int number)
{
return number * number;
}
public static int Add(int a, int b)
{
return a + b;
}
}静的クラスのメンバは、クラス名で直接アクセスされます:
int result = MathHelper.Square(5);
double pi = MathHelper.Pi;静的クラスの制限事項:
newでインスタンス化することはできません- インスタンスコンストラクタを持つことはできません
- 継承することはできません
- 静的フィールド、プロパティ、およびメソッドのみを含むことができます
一般的な例としては、オブジェクトの状態を必要とせずにユーティリティ機能を提供するConsoleクラスやMathクラスがあります。
自分で試してみよう
using System;
using Utilities;
class Program
{
public static void Main(string[] args)
{
// 摂氏温度を読み取る
double celsius = Convert.ToDouble(Console.ReadLine());
// TODO: TemperatureConverter の静的メソッドを使用して以下を行う:
// 1. 摂氏を華氏に変換する
// 2. 華氏を摂氏に戻す
// 3. 温度が絶対零度より上かどうかを確認する
// 4. 絶対零度の定数を取得する
// TODO: 以下の形式で結果を出力する:
// {celsius}C = {fahrenheit}F
// {fahrenheit}F = {convertedBack}C
// Above Absolute Zero: {True/False}
// Absolute Zero: {AbsoluteZeroCelsius}C
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。