using System;
using System.Collections.Generic;
using System.Text;namespace 职责链模式
{
    class Program
    {
        static void Main(string[] args)
        {
            
            Handler h1 = new ConcreteHandler1 ();
            Handler h2 = new ConcreteHandler2();
            Handler h3 = new ConcreteHandler3();
            
            //ConcreteHandler1 h1 = new ConcreteHandler1();
            //ConcreteHandler2 h2 = new ConcreteHandler2();
            //ConcreteHandler3 h3 = new ConcreteHandler3();            h1.SetSuccessor(h2);
            h2.SetSuccessor(h3);            int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };            foreach (int request in requests)
            {
                h1.HandleRequest(request);
            }            Console.Read();        }
    }    abstract class Handler
    {
        protected Handler successor;        public void SetSuccessor(Handler successor)
        {
            this.successor = successor;
        }        public abstract void HandleRequest(int request);
    }    class ConcreteHandler1 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 0 && request < 10)
            {
                Console.WriteLine("{0}  处理请求  {1}",
                  this.GetType().Name, request);
            }
            else if (successor != null)
            {
                successor.HandleRequest(request);
            }
        }
    }    class ConcreteHandler2 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 10 && request < 20)
            {
                Console.WriteLine("{0}  处理请求  {1}",
                  this.GetType().Name, request);
            }
            else if (successor != null)
            {
                successor.HandleRequest(request);
            }
        }
    }    class ConcreteHandler3 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 20 && request < 30)
            {
                Console.WriteLine("{0}  处理请求  {1}",
                  this.GetType().Name, request);
            }
            else if (successor != null)
            {
                successor.HandleRequest(request);
            }
        }
    }}以下两种构造的结果是否完全相同,请详细介绍下(我才学 请讲的通俗些  多谢)            Handler h1 = new ConcreteHandler1 ();
            Handler h2 = new ConcreteHandler2();
            Handler h3 = new ConcreteHandler3();
            
            //ConcreteHandler1 h1 = new ConcreteHandler1();
            //ConcreteHandler2 h2 = new ConcreteHandler2();
            //ConcreteHandler3 h3 = new ConcreteHandler3();

解决方案 »

  1.   

    假设有代码A x=new B();
    这只说明我们声明变量x的类型是A,或者说x可以引用一个A类对象。但是至于x实际引用的对象,可以是A类型的,也可以是A类型的子类的,这就是多态的表现。由于一个ConcreteHandler1实例就是Handler实例,所以编译器允许你声明左边的变量引用为Handler类型。
      

  2.   

    如果你有中文知识,就知道这个“白马还是马”!你不能因为左边在声明变量类型时改变了,就不认识那匹白马了。不论你怎样说它的类型,它这个个体在构造时该是什么类型还是什么类型地。有时候,左边会声明为任何父类或者接口,例如I肉很难吃的动物 x= new 赛马("1234号");
    不论左边声明变量x为什么类型,它所指引的那个对象仍然是那匹马,而不是变了其它的东西。这于是也就根本不会导致提出你在题目中写的“兼容”问题!
      

  3.   

    楼上解说的很详细…Hamdler 作为3个子类的父类  3个子类的对象 自然也从属于父类  但是如果你声明3个父类对象 h1,h2,h3 而这三个类 确不是子类对象 
      

  4.   

    多谢sp1234  cyx1225明白了 其实的意思