
C#初心者を卒業しよう(第2回の解答例)
プログラム
var service = new DistanceService();
service.Run();
public interface IDistance
{
void Calculate(double diatance);
string CreateAnswerMessage();
}
public class DistanceService
{
public void Run()
{
var convertNumber = InputConvertNumber();
var distanceObject = Create(convertNumber);
var distance = InputDistance();
distanceObject.Calculate(distance);
OutputAnswer(distanceObject);
}
protected virtual int InputConvertNumber()
{
Console.WriteLine("Please input convert number.");
Console.WriteLine("1 : Convert meters to yards.");
Console.WriteLine("2 : Convert yards to meters.");
Console.WriteLine("3 : Convert meters to feet.");
Console.WriteLine("4 : Convert feet to meters.");
if (!int.TryParse(Console.ReadLine(), out var convertNumber))
{
throw new FormatException("Invalid input convert number.");
}
return convertNumber;
}
protected virtual IDistance Create(int convertNumber)
{
switch (convertNumber)
{
case 1:
return new ToYards();
case 2:
return new ToMeters();
case 3:
return new MetersToFeet();
case 4:
return new FeetToMeters();
default:
throw new ArgumentOutOfRangeException(
$"{convertNumber} is out of range.");
}
}
protected virtual double InputDistance()
{
Console.WriteLine("Please input distance.");
if (!double.TryParse(Console.ReadLine(), out var distance))
{
throw new FormatException("Invalid input distance.");
}
return distance;
}
protected virtual void OutputAnswer(IDistance distance)
{
var outputMessage = distance.CreateAnswerMessage();
Console.WriteLine(outputMessage);
}
}
public class ToYards : IDistance
{
private double _yards;
private double _meters;
public void Calculate(double meters)
{
_meters = meters;
_yards = meters * 1.0936133d;
}
public string CreateAnswerMessage()
{
return $"{_meters} meters is {_yards} yards.";
}
}
public class ToMeters : IDistance
{
private double _yards;
private double _meters;
public void Calculate(double yards)
{
_yards = yards;
_meters = yards / 1.0936133d;
}
public string CreateAnswerMessage()
{
return $"{_yards} yards is {_meters} meters.";
}
}
public class FeetToMeters : IDistance
{
private double _feet;
private double _meters;
public void Calculate(double feet)
{
_feet = feet;
_meters = feet * 0.3048d;
}
public string CreateAnswerMessage()
{
return $"{_feet} feet is {_meters} meters.";
}
}
public class MetersToFeet : IDistance
{
private double _feet;
private double _meters;
public void Calculate(double meters)
{
_meters = meters;
_feet = meters / 0.3048d;
}
public string CreateAnswerMessage()
{
return $"{_meters} meters is {_feet} feet.";
}
}
ダウンロード
解説
今回は第1回の解説と全く同じです。
入力メッセージを追加
ここは問題ありませんね。
Console.WriteLine("3 : Convert meters to feet.");
Console.WriteLine("4 : Convert feet to meters.");
オブジェクト生成を追加
オブジェクト生成部分を追加します。ここが、今回のメインですね。
public class DistanceFactory
{
public static IDistance Create(int convertNumber)
{
switch (convertNumber)
{
case 1:
return new ToYards();
case 2:
return new ToMeters();
case 3:
return new MetersToFeet();
case 4:
return new FeetToMeters();
default:
throw new ArgumentOutOfRangeException(
$"{convertNumber} is out of range.");
}
}
}
変換クラスを追加
メートルをフィートに変換するクラスを追加します。
public class MetersToFeet : IDistance
{
private double _feet;
private double _meters;
public void Calculate(double meters)
{
_meters = meters;
_feet = meters / 0.3048;
}
public string CreateAnswerMessage()
{
return $"{_meters} meters is {_feet} feet.";
}
}
フィートをメートルに変換するクラスを追加します。
public class FeetToMeters : IDistance
{
private double _feet;
private double _meters;
public void Calculate(double feet)
{
_feet = feet;
_meters = feet * 0.3048;
}
public string CreateAnswerMessage()
{
return $"{_feet} feet is {_meters} meters.";
}
}
いいなと思ったら応援しよう!
