林喆吧 关注:43贴子:1,680
  • 0回复贴,共1

讲故事谈.NET委托:一个C#睡前故事

取消只看楼主收藏回复

从前,在南方一块奇异的土地上,有个工人名叫彼得,他非常勤奋,对他的老板总是百依百顺。但是他的老板是个吝啬的人,从不信任别人,坚决要求随时知道彼得的工作进度,以防止他偷懒。但是彼得又不想让老板呆在他的办公室里站在背后盯着他,于是就对老板做出承诺:无论何时,只要我的工作取得了一点进展我都会及时让你知道。彼得通过周期性地使用“带类型的引用” (原文为:“ typed reference” 也就是 delegate?? )“回调”他的老板来实实现他的承诺,如下:
 


class Worker {
    public void Advise(Boss boss) { _boss = boss; }
    public void DoWork() {
        Console.WriteLine(“ 工作 : 工作开始 ”);
        if( _boss != null ) _boss.WorkStarted();

        Console.WriteLine(“ 工作 : 工作进行中 ”);
        if( _boss != null ) _boss.WorkProgressing();

        Console.WriteLine("“ 工作 : 工作完成 ”");
        if( _boss != null ) {
            int grade = _boss.WorkCompleted();
            Console.WriteLine(“ 工人的工作得分= ” + grade);
    }
}
private Boss _boss;
}

class Boss {
    public void WorkStarted() { /* 老板不关心。 */ }
    public void WorkProgressing() { /* 老板不关心。 */ }
    public int WorkCompleted() {
        Console.WriteLine(“ 时间差不多! ”);
        return 2; /* 总分为 10 */
    }
}

class Universe {
    static void Main() {
        Worker peter = new Worker();
        Boss boss = new Boss();
        peter.Advise(boss);
        peter.DoWork();

        Console.WriteLine(“Main: 工人工作完成 ”);
        Console.ReadLine();
    }
}  


接口  


  现在,彼得成了一个特殊的人,他不但能容忍吝啬的老板,而且和他周围的宇宙也有了密切的联系,以至于他认为宇宙对他的工作进度也感兴趣。不幸的是,他必须也给宇宙添加一个特殊的回调函数 Advise来实现同时向他老板和宇宙报告工作进度。彼得想要把潜在的通知的列表和这些通知的实现方法分离开来,于是他决定把方法分离为一个接口:  


interface IWorkerEvents {
    void WorkStarted();
    void WorkProgressing();
    int WorkCompleted();
}

class Worker {
    public void Advise(IWorkerEvents events) { _events = events; }
    public void DoWork() {
        Console.WriteLine(“ 工作 : 工作开始 ”);
        if( _events != null ) _events.WorkStarted();

        Console.WriteLine(“ 工作 : 工作进行中 ”);
        if(_events != null ) _events.WorkProgressing();

        Console.WriteLine("“ 工作 : 工作完成 ”");
        if(_events != null ) {
            int grade = _events.WorkCompleted();

            Console.WriteLine(“ 工人的工作得分= ” + grade);
            }
    }
    private IWorkerEvents _events;
}

class Boss : IWorkerEvents {
    public void WorkStarted() { /* 老板不关心。 */ }
    public void WorkProgressing() { /* 老板不关心。 */ }
    public int WorkCompleted() {
        Console.WriteLine(“ 时间差不多! ”);
        return 3; /* 总分为 10 */
    }
}  


委托  


  不幸的是,每当彼得忙于通过接口的实现和老板交流时,就没有机会及时通知宇宙了。至少他应该忽略身在远方的老板的引用,好让其他实现了 IWorkerEvents的对象得到他的工作报告。( ”At least he'd abstracted the reference of his boss far away from him so that others who implemented the IWorkerEvents interface could be notified of his work progress” 原话如此,不理解到底是什么意思 )  



1楼2008-04-17 22:38回复