导航

C# override new 的区别

Posted on 2009-07-15 23:21  阳光有约  阅读(200)  评论(0编辑  收藏  举报

老的不行的问题想起来了巩固复习一下

首先:

override是重载(有的翻译为覆盖),new是隐藏。

override可以通过父类的引用调用子类的方法,new只能各自调用各自的方法。

再有:
override覆盖虚方法,这样的话,子类里使用了新的方法体(父类方法/函数的功能被子类覆盖);New的话还是使用父类的方法,比如父类有个方法abc(),子类也有一个abc,可以使用new abc()避免编译器警告,但使用父类的abc()

例如:
A a=(A)(new B());//以父类变量引用子类

a.MethodA();  //实际调用的是B.MethodA(); 这个地方其实就说明了 MethodA 被覆盖了,原来父类A的方法在之类中已经不复存在了
a.MethodB(); //调用的是a.MethodB(); 而这个地方,用父类变量访问之类的时候,被new隐藏的MethodB()还是可以被读取出来的。

大概new的方法,大概就类似老大对小弟留了一手

 

示例代码大家懒得写可以拷贝一下再测试 呵呵

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    public class A
    {
        public virtual void MethodA()
        {
            Console.WriteLine("A.MethodA");
        }

        public void MethodB()
        {
            Console.WriteLine("A.MethodB");
        }
    }

    public class B : A
    {
        public override void MethodA()
        {
            //  base.MethodA();
            Console.WriteLine("B.MethodA");
        }

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

    class Program
    {
        static void Main(string[] args)
        {
            A A1 = new B();
            A1.MethodA();
            A1.MethodB();
            B B1 = new B();
            B1.MethodA();
            B1.MethodB();
        }
    }
}