为什么我用子类调用子类的一个重写了的方法,它却调用父类的虚方法?

解决方案 »

  1.   

     父类
    public virtual MemoryStream Pack()
            {
                
                
                byte[] pack = new byte[8];
                pack[0] = Convert.ToByte(MsgConst.StartCode);
                pack[1] = Convert.ToByte(this.DataLen);
                pack[2] = Convert.ToByte(MsgConst.StartCode);
                pack[3] = Convert.ToByte(this.RegionalCode);            //CollectorAddress 为ushort类型,占 2 字节,表示 16 位正整数,byte 字节型,占 1 字节,表示 8 位正整数.所以要把 CollectorAddress拆开来
                byte[] tempPack = new byte[2];
                tempPack = BitConverter.GetBytes(this.CollectorAddress);            //将CollectorAddress拆开后的数据放进去
                pack[4] = tempPack[0];
                pack[5] = tempPack[1];            pack[6]= Convert.ToByte(this.CtrlCode);
                pack[7]= Convert.ToByte(this.TypeCode);            //基类消息,根本不需要打包这么多,只要打包到数据域之前就行了           // pack[8] = this.Crc[0];
               // pack[9] = this.Crc[1];
                         ////将结束符打包到进去
               // pack[10] = Convert.ToByte(MsgConst.EndCode);            MemoryStream packStream = new MemoryStream(pack);           
                return packStream;        }
      

  2.   

    子类
    public override MemoryStream Pack()
            {            byte[] pack = new byte[14];
                pack[0] = Convert.ToByte(MsgConst.StartCode);            pack[1] = Convert.ToByte(this.DataLen);            pack[2] = Convert.ToByte(MsgConst.StartCode);
                pack[3] = Convert.ToByte(this.RegionalCode);            //CollectorAddress 为ushort类型,占 2 字节,表示 16 位正整数,byte 字节型,占 1 字节,表示 8 位正整数.所以要把 CollectorAddress拆开来
                byte[] tempPack = new byte[2];
                tempPack = BitConverter.GetBytes(this.CollectorAddress);            //将CollectorAddress拆开后的数据放进去
                pack[4] = tempPack[0];
                pack[5] = tempPack[1];            //将控制码打包进去
                pack[6] = Convert.ToByte(this.CtrlCode);            //将类型码打包进去
                pack[7] = Convert.ToByte(this.TypeCode);            //将CRC16校验码打包进去
                pack[8] = this.Crc[0];
                pack[9] = this.Crc[1];
                
                //申请调用密码处理方法
                PassWordTransForm passWordTransForm=new PassWordTransForm();            //将密码进行处理,处理后密码被转为一个16进制的byte[]数组
                byte[]passWordBytes=passWordTransForm.PassWordStringToBytes(this.PassWord);            //将处理后的密码数组打包进去
                int i = 0;
                for (i = 10; i <=passWordBytes.Length+10;i++ )
                {
                    pack[i] = passWordBytes[0];
                }
          
                //将结束符打包到进去
                pack[i] = Convert.ToByte(MsgConst.EndCode);            MemoryStream packStream = new MemoryStream(pack);
                return packStream;
            }