C#:区分:重写、覆盖和重载以及虚方法和抽象方法

本文详细解析了C#中的方法重写与重载的概念,包括虚方法、抽象方法的区别,以及如何通过代码实例来理解这些概念。文章还介绍了重写与覆盖的区别,重载与覆盖的不同之处。

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

(一)重写和覆盖:

重写:
在声明时,父类的方法前面加上virtual关键字,子类的方法前面加上override关键字,且与父类方法同名,表示父类的方法可以被子类进行修改和重新定义。
覆盖:
在声明子类方法的时候,添加new关键字,定义与父类同名的方法,称为覆盖。
区别:
当用子类创建父类的时候,重写调用的是子类中的功能,而覆盖调用的仍然是父类的功能。用子类创建子类和用父类创建父类的时候,则相应的进行调用。

下面是当子类创建父类时,重写和覆盖的区别的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 重写和覆盖
{
    class Program
    {
        static void Main(string[] args)
        {
            C1 c1 = new C2();
            Console.WriteLine("重写后的c1应该是:SonOverride; 屏幕显示是:{0}",c1.FClass());
            C3 c3 = new C4();
            Console.WriteLine("覆盖后的c3应该是:NewFather; 屏幕显示是:{0}", c3.nFClass());
            Console.ReadKey();
        }

        #region   重写方法的函数
        public class C1 {
            public virtual string FClass() {
                return "FatherOverrride";
            } 
        }
        public class C2 : C1 {
            public override string FClass()
            {
                return "SonOverride";
            }
        }
        #endregion

        #region   覆盖方法的函数
        public class C3 {
            public string nFClass() {
               return "NewFather";
            }
        }
        public class C4 : C3 {
            public new string nFClass()
            {
                return "NewSon";
            }
        }
        #endregion
    }
}

这里写图片描述

(二)重载和覆盖

重载:
函数重载允许创建多个同名函数,每个函数可使用不同的参数类型。优点是不必显示地指定要使用哪个函数,只需要提供一个数组参数,就可以根据参数类型执行相应的函数。
覆盖:
参考(一)。
区别:
重载是发生在同一个类中,覆盖是发生在一个父类和一个子类之间。

下面是重载的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 函数重载
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] myArray1 = {1,2,3,100,5,6};
            double[] myArray2 = {1.1,50.8,21,3.4,5};
            int intmaxVal = MaxValue(myArray1);
            double doublemaxVal = MaxValue(myArray2);
            Console.WriteLine("int类型的返回最大值为{0}\ndouble类型的返回最大值为{1}",intmaxVal,doublemaxVal);
            Console.ReadKey();
        }

        static int MaxValue(int[] myArray)
        {
            int maxValue = myArray[0];
            for (int i = 0; i < myArray.Length;i++ ) {
                if(maxValue<myArray[i]){
                    maxValue=myArray[i];
                }
            }
            return maxValue;
        }
        static double MaxValue(double[] myArray)
        {
            double maxValue = myArray[0];
            for (int i = 0; i < myArray.Length; i++)
            {
                if (maxValue < myArray[i])
                {
                    maxValue = myArray[i];
                }
            }
            return maxValue;
        }

    }
}

这里写图片描述

(三)虚方法和抽象方法

虚方法:用virtual关键字
使用方法:
(1)可以在子类(派生类)中用override重写父类(基类)的方法
(2)可以在子类中直接由对象调用,使用基类中的方法
抽象方法:用abstract关键字
抽象方法是只有定义、没有实际方法体的函数,它只能在抽象函数中出现,并且必须在子类中重写。

http://www.cnblogs.com/LilianChen/archive/2013/03/04/2942634.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值