1

封じ込め/委任を正しい方法で見ているかどうかを調べようとしています。この例では、CarRadioタイプがあります。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、最初の反復は実際には委譲ではないように感じますが、一方の方法の欠点が他方よりも少ないかどうかを知りたいです。

4

2 に答える 2

0

あなたはおそらく次のようなものを参照しています:

    class Car
    {
        // Car 'has-a' Radio.
        protected Radio radio = new Radio();
        public Radio MyRadio
        {
            get { return radio; }
            set { radio = value; }
        }
        public void TurnOnRadio(bool onOff)
        {
            // Delegate call to inner object.
            MyRadio.TurnOn(onOff);
        }
    }

    public class Radio
    {
        public string ModelNumber { get; set; }
        public bool IsOn { get; set; }

        public void TurnOn(bool turnOn)
        {
            if (turnOn)
            {
                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");
                }
            }

        }

    }

ラジオンは車だから?ではない場合、車にはラジオがあり、ラジオをオンまたはオフにするために直接呼び出します。

Car c = new Car();
c.TurnOnRadio(true);
于 2013-07-12T15:34:31.700 に答える