自已总结下new与override

就自已总结下,平常经常用,半懂不懂状态,今天总结下,清楚多了,嘿嘿
引用AnyTao博客中的一句话:
覆写(override)与重载(overload),是成就.NET面向对象多态特性的基本技术之一
正如某网友说的那一句话:
Override  覆写  就是把原来的换掉了
new        新的  就是两个共存着

通过接口比较
如果希望 覆载 基类方法,你需要使用override(也即是告诉全世界,他儿子成年了,能自已负起责任)
用书里的一句话描述new吧:只有在处理对子类的显式引用时,new修饰符才会提供子类的行为(必须有virtual好像)
如果你想提供基类的行为,使用new指令(有无virtual无所谓) 

其实从继承来说,先是访问其父类(通过接口),然后如果其子类有override或者显示的实现了父类的方法,就找子类,如没有,则找父类

public class A:Itrace
{
public vortual void TraceSelf()//virtual是可选的
{
打印"A"
}
}
public class B:A
{
public new void TraceSelf()
{
打印B
}
}

而无论是Itrace obj=new B
还是A obj=new B

都是打印出"A",除非显示的接口
public class B:A,ITrace
{

}
而以下代码则是根据此类为依据而对几种情况的假设而得出的,
没什么技术含量,但如能亲手打一遍,总觉得比看书还重要,其实学习的过程也是这样的
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

namespace Inte
{
    public interface ITrace
    {
        void TraceSelf();
    }

    public class A : ITrace
    {

        #region ITrace 成员   隐式

        public virtual void TraceSelf()
        {
            Console.WriteLine("a");
        }

        #endregion
    }

    public class B : A, ITrace
    {

        #region ITrace 成员 隐式

        public override void TraceSelf()
        {
            Console.WriteLine("b");
        }

        #endregion

        //#region ITrace 成员 显示

        //void ITrace.TraceSelf()
        //{
        //    Console.WriteLine("The method or operation is not implemented.");
        //}

        //#endregion
    }

    class Program
    {
        static void Main(string[] args)
        {
            //A  obj = new B();
            //Console.WriteLine("此时是new,且 A  obj = new B()");
            //此时是new了一个,但是是隐式的
            /*********************************/
            //此时是new,且 A  obj = new B()
            //a
            //虽然有new ,但只有在处理显示引用时,NEW才有用
            /**************************/
            //obj.TraceSelf();

            //此时是new了一个,但是是显式的
            /*********************************/
            //但其实还是同上一样的结果
            //因为此时引用的是"A"
            //所以其实访问的都是A的,不管是否有new


            //此时代码还是跟上面的一样,

            B obj = new B();
            obj.TraceSelf();

            //此时是显示的实现了接口
            //则打印:"The method or operation is not implemented."
            //而当把其显示部分注释掉时
            //void ITrace.TraceSelf()
            //{
            //    Console.WriteLine("The method or operation is not implemented.");
            //}
            //打印结果是b
            //此时,NEW才起作用
            //而此时再把NEW改成override
            //此时打印的也是B
            //而如果此时不显示的实现接口
            //则NEW依然是打印A
            //而OVERRIDE是打印b

            //以上结论,new只有在显示的实在接口上才有用
            //因为此时等同于重新实现了一此类的接口
            //但即使是显示的有接口了,但如果有显示的实现了
            //NEW的也是被忽略掉了
            Console.ReadLine();
        }
    }
}

而以下的是以抽象类为例写的,是参考lifengguo 's Blog

也就是抄过来的,哈哈,http://www.cnblogs.com/lifengguo/archive/2007/06/13/781704.html
我觉得这篇写的挺好的,也就照着写了一遍,加深印象,与各位分享下,嘿嘿
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication4
{
    abstract class Base
    {
        public abstract void Pay();       //声明抽象方法,必须要被子类new 或 override;只有当类是abstract时才可以声明abstract方法
        public virtual void work()
        {
            Console.WriteLine("基类--开始工作");
        }

        public virtual   void outwork()
        {
            Console.WriteLine("基类--下班");
        }
    }

    class Employee : Base
    {

        public new void work()
        {
            Console.WriteLine("子类(new)--开始工作");
        }

        public override void outwork()
        {
            Console.WriteLine("子类(override)下班");
        }

        public override void Pay()   //此时必须是override
        {
            Console.WriteLine("The method or operation is not implemented.");
        }
      
    }         

    class Program
    {
        static void Main(string[] args)
        {
            //第一种情况
            //Employee emp = new Employee();

            //emp.work();              //子类(new)--开始工作

            //emp.outwork();          //子类(override)下班      

            //第二种情况
            //Employee emp = new Employee();

            //Base b = (Base)emp;   //指向抽象类了

            //b.work();                //基类--开始工作

            //b.outwork();             //子类(override)下班

            //第三种情况
            Base b = new Employee();

            //同上面是一样的

            b.work();                //基类--开始工作

            b.outwork();             //子类(override)下班

            Console.ReadLine();
        }
    }
}

那位达人能告诉我那种黑色背景贴代码是怎么搞出来的呀,小弟新手,郁闷了,代码乱七八糟,但我觉得COPY过去自已改改,那样理解起来才重要,

望达人相告
谢谢




posted @ 2008-04-20 14:54  yellowyu  阅读(613)  评论(2编辑  收藏  举报