日期:2014-05-18  浏览次数:20820 次

隐藏基类方法疑问与调用方法(this)方法疑问
两个问题-问题1:
隐藏基类方法我不明白。看代码
C# code

    class MyBase
    {
        public void Print()
        {
            Console.WriteLine("基类Pint()方法");
        }

    }

    class MyClass : MyBase
    {
        new public void Print()
        {
            Console.WriteLine("继承类隐藏后的Pint()方法");
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            MyClass myObj = new MyClass();
            myObj.Print();
            Console.ReadKey();
        }
    }



这时的返回结果是:"继承类隐藏后的Pint()方法",为什么不是"基类Pint()方法".
书中说到:基类的方法不必是虚拟的,但结果是一样的,只需修改上面代码中的一行即可。对于基类的虚拟方法和非虚拟方法来说。基结果如下:"基类Pint()方法".

问题2:
调用本类中的方法使用this修饰符。看代码
C# code

    class MyBase
    {
        //................
    }

    class MyClass : MyBase
    {
        public void thisWrite()
        {
            Console.WriteLine("调用thisWrite()方法");
        }

        public void myWrite()
        {
            MyClass myObj = new MyClass();
            myObj.thisWrite(this);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyClass myObj = new MyClass();
            myObj.thisWrite();
        }
    }


提示错误:错误 thisWrite”方法没有采用“1”个参数的重载
在myWrite()方法中实例化。感觉怪怪的。实便的还是此方法所在的类。又在Program类中再次实例化。上面的代码是我根据书。理解所写。
请朋友帮助分析讲解下。谢谢。

------解决方案--------------------
在第一段代码中楼主使用的new关键字创建子类方法
并未用override关键字来重写父类的方法

而且楼主在实例化对象的时候并未采用多态形式

一下是修改结果
C# code

class MyBase
    {
        public void Print()
        {
            Console.WriteLine("基类Pint()方法");
        }

    }

    class MyClass : MyBase
    {
        public override void Print()
        {
            Console.WriteLine("继承类隐藏后的Pint()方法");
        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            MyBase myObj = new MyClass();
            myObj.Print();
            Console.ReadKey();
        }
    }

------解决方案--------------------
老大我水平有限,说不清楚,我还没看明白你说的是什么问题。
你第一个问题想调用基类的方法,但是你两个方法名字写的一样不好搞,弱国像你那样写还想调用基类方法
的话,你创建对象的时候这样写MyBase myObj = new MyClass();
 然后你在调用myObj.Print(); 就是基类的方法了
你看我这样写你明白否

C# code

 class MyBase
    {
        public MyBase()
        {
            Console.Write("基类构造方法!");
        }
        public void Baserint()
        {
            Console.Write("基类的方法!");
        }
    }
    class MyClass:MyBase
    {
        public MyClass()
        {
            Console.Write("子类构造方法!");
        }
        public void ClassPrint()
        {
            Console.Write("子类的方法!");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            MyClass myObj = new MyClass();
            myObj.Baserint();
            myObj.ClassPrint();
            Console.ReadKey();
        }
    }