1

我试图找出我是否以正确的方式看待收容/授权。在这个例子中,我有一个Car和一个Radio类型。我有一个函数,它接受一个字符串并更改IsOnRadio 对象的属性值。我想知道哪种方法(或两者都不是)是否足以解决此问题。

(为简单起见,请忽略传入字符串到 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

我想到的另一种方法是将以下函数添加到 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

1

您的第二种方法是委托。第一种方法不是。

委托意味着您要求某个对象(例如Car)打开收音机。Car不知道如何打开收音机,但他知道谁会。于是他把消息传递给Radio

您的第一种方法是简单地公开收音机对象,这不是委托,因为Car从不接收打开收音机的请求,因此从不委托打开收音机的请求。

此外,许多纯粹主义者会批评您的第一种方法,因为它违反了Demeter 法则,但在实践中,我发现自己偶尔会这样做是为了方便/可读性。(也许我只是一个蹩脚的开发者?)

于 2013-07-12T15:21:50.727 回答
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");
                }
            }

        }

    }

既然Radion是一辆车?不是,那么汽车有一个收音机,你可以直接打电话来打开或关闭收音机。

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