封じ込め/委任を正しい方法で見ているかどうかを調べようとしています。この例では、Car
とRadio
タイプがあります。IsOn
文字列を受け取り、Radio オブジェクトのプロパティの値を変更する関数があります。この問題を解決するのに十分な方法がある場合、どのアプローチ (またはどちらでもない) を知りたいです。
(簡単にするために、TurnOn メソッドへの着信文字列の検証は無視してください)
public int Year { get; set; }
public string Model { get; set; }
protected Radio radio = new Radio();
public Radio MyRadio
{
get { return radio; }
set { radio = value; }
}
public class Radio
{
public string ModelNumber { get; set; }
public bool IsOn { get; set; }
public void TurnOn(string turnOn)
{
if (turnOn == "yes")
{
if (IsOn)
Console.WriteLine("The radio is already on");
else
{
IsOn = true;
Console.WriteLine("You turned on the radio");
}
}
else
{
if (IsOn)
{
IsOn = false;
Console.WriteLine("You turned off the radio");
}
}
}
}
これを Main メソッドでテストしました。出力はコメントの各行の横にあります
Car c = new Car();
Console.WriteLine(c.MyRadio.IsOn); //false
c.MyRadio.TurnOn("yes"); //you turned on the radio
Console.WriteLine(c.MyRadio.IsOn);//true
c.MyRadio.TurnOn("yes"); //the radio is already on
c.MyRadio.TurnOn("no"); //you turned off the radio
Console.WriteLine(c.MyRadio.IsOn); //false
私がこれを行うことを考えたもう1つの方法は、次の関数を Car クラスに追加することでした
public void CarChangesState(string s)
{
MyRadio.TurnOn(s);
}
次のコードでテストしたところ、すべてが期待どおりに機能しました
Car c2 = new Car();
Console.WriteLine(c2.MyRadio.IsOn);//false
c2.CarChangesState("yes"); //you turned on the radio
Console.WriteLine(c2.MyRadio.IsOn);//true
c2.CarChangesState("yes");//the radio is already on
c2.CarChangesState("no");//you turned off the radio
Console.WriteLine(c2.MyRadio.IsOn); //false
ある例は他の例よりも優れていますか? 私の読書からPro C# and the .NET Framework
、最初の反復は実際には委譲ではないように感じますが、一方の方法の欠点が他方よりも少ないかどうかを知りたいです。