C#重写 重载 new

本文探讨C#中的多态性,包括重载(overload)和重写(override)的概念。重载是同名但参数不同的方法,由编译器根据实参选择合适的方法。重写则是子类对父类虚方法的扩展或修改,需在子类中声明为override。new关键字用于隐藏父类方法,创建不同的函数。理解这些概念有助于深入理解C#的面向对象特性。

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

重载就是多态的一种体现


多态的原理表述:一个父类可以有多个子类,父类是子类中方法的“交集”,子类中可以根据自己实际需要来加入新的方法,或则完善父类中的方法,当把子类的对象赋值给父类类型的对象时,这时候在调用同一个方法,就会根据子类中方法的不同,而得到不同的执行结果。


体现多态性的一个实例:面向对象程序设计中的另外一个重要概念是多态性。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。 可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中。 如果这些对象都有同名方法,就可以调用每个对象的同名方法。

            

overload(重载):同一个类中,同名不同参数的方法,实现重载不用关键字,根据实际调用时候的实参来选择用哪种方法,(注:返回值不能区别函数是否重载),重载没有关键字

override:父类中的虚方法,子类中来完善

new:不同类中(基类或派生类)有两个或多个返回类型、方法名、参数都相同,但是方法体不同的方法(被隐藏父类方法可以通过调用得到)。


关于重载的实例:

 public void Fun()
        {
            Console.WriteLine("我是没有参数的Fun方法,嘿嘿");
        }

        public void Fun(string input)
        {
            Console.WriteLine("我是带参数的Fun方法我叫"+input);
        }

重载总结:同名不同参(参数类型),要问用哪个,根据参数(实际调用方法时使用的实参类型)来


关于重写的实例

    class Father
    {
          public virtual void Say()
        {
            Console.WriteLine("我是父类中的虚方法");
        }

    }
    class Daughter:Father
    {
        public override void Say()
        {
           // base.Say();
            Console.WriteLine("有其父必有其女,我是女儿中的方法");
        }
    }

    class Son : Father
    {
        public override void Say()
        {
            Console.WriteLine("虎父无犬子,我是儿子中的重写方法");
        }
    }

static void Main(string[] args)
        {
            Father f = new Father();
            f.Say();
            Daughter d = new Daughter();
            d.Say();
            Son s = new Son();
            s.Say();
        }


下面这个样子可以得到一样的结果

 static void Main(string[] args)
        {
            Father[] team = new Father[2]; 
        
            team[0] = new Daughter();

            team[1] = new Son();

            foreach (Father enen in team)
            {
                enen.Say();
            } 
        }


上面个就是重写overide

重写总结:父类虚方法,子类来重写,既都为方法,功能均自全

1 重写是子类“完善”父类中的方法

2 父类的虚方法也是有实际功能的

3 virtual就是个标识,告诉子类这个父类的方法可以继续“完善”

备注:重写的基方法必须与override 方法具有相同的签名。重写的基方法必须是virtualabstractoverride,不能重写非虚方法或静态方法
override的方法和virtual的方法必须具有相同的访问级别修饰符
,不能更改virtual 方法的可访问性不能使用newstaticvirtual 修饰符来修改 override 方法。


new 覆盖

覆盖的意思就是写了一个新的函数,即使是名字参数都是一样的,那么在内存中也是完全不同的函数

上面的多态中之所以能用子类对象赋值给父类,然后再在这个对象中调用子类中的方法,是因为子类继承父类,实际上在内存中子类方法优先调用,不行再调用父类的

但是使用了new后,那么再用这儿方法就不能用父类对象调用子类方法了,因为这两个方法实质上已经不同了·


还是用个例子吧 还是上面那些类

代码是

    static void Main(string[] args)
        {
            Father b = new Son();
            b.Say();
        }
得到的结果是

这就是覆盖了··要自己体会··



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值