new 与 override的区别 转

本文详细解析了 C# 中的多态概念,包括 new 和 override 的区别、抽象类与抽象方法的使用方式及注意事项。通过具体示例说明了如何在子类中正确重写或隐藏父类的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自http://www.cnblogs.com/lifengguo/

"abstract class Base

    {

        public virtual void work()

        {

            MessageBox.Show("基类--开始工作");

        }

        public virtual void outwork()

        {

            MessageBox.Show("基类--下班");

        }

        

        Public abstract void Pay();       //声明抽象方法,必须要被子类new 或 override;只有当类是abstract时才可以声明abstract方法    

    }

    class Employee : Base

    {

        public new void work()

        {

            MessageBox.Show("子类(new)--开始工作");

        }

        public override void outwork()

        {

            MessageBox.Show("子类(override)下班");

        }

}               

//测试代码

            Employee emp = new Employee();

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

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

            Employee emp = new Employee() ;

            Base b = (Base)emp;

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

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

new声明的方法,当使用子类的类型来调用的时候,它会运行子类中的函数,而如果类型是基类的话,被隐藏的基类函数就会站到前台来。只有使用virtual定义基类中的函数,并使用override标记子类中的函数,才可以达到想要的多态类(始终调用子类的方法)。

在子类中new父类中的方法,父类中的方法不一定是虚类型,即virtual

但是在子类中override父类中的方法,父类的方法一定得是虚类型,即

借用优快云网友(CForce)的话:

override-覆盖(旧的没有了)

new-新的(新旧共存)

抽象类与抽象方法

    abstract class Animal

    {

        public abstract void Drink();

        public abstract void GotoBed();

    }

    class Dog : Animal

    {

        public override void Drink()

        {

            MessageBox.Show("小狗喝水");

        }

        public override void GotoBed()

        {

            MessageBox.Show("小狗睡觉");

        }

        public override string ToString()   //也可:public new string ToString()

        {

            return "小狗";

        }

    }

1、                抽象方法,必须要被子override;只有当类是abstract时才可以声明abstract方法  

2、                因为abstract方法没有方法实现,其子类只能对其abstract方法进行override,不能new,如果可以new的话,那么类的类型是父类的话,类的方法执行的是父类的方法而非子类的方法,而父类的方法却没有方法实现,那么将如何执行呢?

Selaed 方法必须与override连用,也就是说实现sealed方法的类的父类必须实现了此方法

如下,A声明了virtual方法A1,那么A的子类AA才能对Pay进行密封重写,AA的子类不能对A1重写或覆盖。

    class A

    {

        public virtual void A1()

        {

            MessageBox.Show("A---A1");   

        }

    }

    class AA:A

    {

        public sealed override void A1()

        {

            MessageBox.Show("AA---A1");

        }        

    }

总结:

Public abstract void pay();                 abstract方法没有方法实现,必须继承

Public sealed override void pay(){}      sealed方法必须是重写父类的方法

Public static void pay(){}                   static方法通过类名访问

Public virtual void pay(){}                  virtual方法子类可以对其overridenew

Public new void pay(){}                     父类的方法pay不一定是virtual

Public override void pay(){}                父类的方法pay一定要是virtual"

转载于:https://www.cnblogs.com/ndxsdhy/archive/2011/08/27/2155232.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值