C#里的重写花式体验

3/10/2023 2:26:27 PM
589
0

一、重写的应用

		public  class A
        {
            protected  void fun1()
            {
                fun2();
            }
    
            protected    virtual  void fun2()
            {
                Console.WriteLine("A.fun2");
            }
        }
    
        public  class B : A
        {
            public  void Test()
            {
                base.fun1();
            }
    
            protected   void fun2()
            {
                Console.WriteLine("B.fun2");
            }
        }
        public class Program
        {
            public static void Main(string[] args)
            {
                
                B model = new B();
                model.Test();
    
            }
        }

 

客官可猜输出是什么?

答案:  A.fun2

二、隐藏父类的成员

然而我们修改一下class.B的代码

    

protected  new  void fun2()
{
    	Console.WriteLine("B.fun2");
}

 

注意  这里我们使用了 new  修饰符,new修饰符的含义是隐藏父类的同签名成员

客官可猜到本次的输出是什么? A.fun2

 三、重写父类的成员

protected   override  void fun2()
{
	Console.WriteLine("B.fun2");
}

输出是什么? B.fun2

如果在java中,我们第一次的代码就直接输出  B.fun2 ,因为 java 中同名方法会重写  父类方法,但是

C# 中必须明确的用虚方法和 override关键词来重写父类方法

 

四、子类实例化为父类对象 

我们再次改一下class.B的代码


    public class B : A
    {
        public void fun1()
        {
            base.fun1();
        }

        public void fun2()
        {
            Console.WriteLine("B.fun2");
        }
    }
    
    public class Program
    {
        public static void Main(string[] args)
        {
  

            A model = new B();
            model.fun1();

        }
    }

当我们使用 A model=new B();  来实例化对象时候,输出依然是  A.fun2

五、使用  override   关键词

        public override  fun2()
        {
            Console.WriteLine("B.fun2");
        }

再次使用 override   关键词改造 B的 fun2后,输出 B.fun2

六、子类中创建父类中的同名成员

    public class B : A
    {
        public void fun1()
        {
            fun1();
        }

        public void fun2()
        {
            Console.WriteLine("B.fun2");
        }
    }

为B类增加  fun1() 成员

按我们上文中的结论,B的fun1 里边调用的是 A的fun1 ,如果不是,这里就死循环了。所以 B里的fun1 作用和刚开始  B里的 Test() 作用相同。这里的输出:A.fun2

 


    public class Person
    {
        public virtual void Say()
        {
            Console.WriteLine("say: hello");
        }
    }
    public class People1 : Person
    {
        public override void Say()
        {
            Console.WriteLine("say: nihao");
        }
    }
    public class People2 : Person
    {
        public new void Say()
        {
            Console.WriteLine("say: sawadika");
        }
    }
    public class People3 : People2
    {
        public  void Say()
        {
            Console.WriteLine("say: laosan");
        }
    }
            Person p = new Person();
            p.Say();                            //say: hello
            Person p1 = new People1();
            p1.Say();                           //say: nihao
            Person p2 = new People2();
            p2.Say();                           //say: hello
            Person p3 = new People3();
            p3.Say();                           //say: hello

 

所以我们得出一个结论: 

C# 中必须明确的用虚方法和 override关键词来重写父类方法

当子类重写了父类的方法后,当子类代替父类出现时都将使用子类的 方法,而不使用自己父类的方法

 

全部评论



提问