剪不断理还乱--C#重载/重写/覆盖

         在实际的编程中会有很多类、方法、函数等出现同名的情况,造成了程序的可读性差的问题。为了避免这种问题的出现,C#提供了很多机制来区别或修改同名的函数或方法,如:命名空间、类名、重载和覆盖等。这篇博客将会对重载和覆盖进行比较,并通过例子来强化记忆。

 一、重载

  1、重载示意

    重载(Overload)是重新加载的意思,指的是同一个类中同名,但是参数列表不同的方法组(返回值不能区别函数是否重载),重载没有关键字。通俗点说重载是对内存中同一个类中的函数或方法进行重新加载的意思。

  2、发生条件

    必须发生在一个类中,函数名相同,参数类型或者顺序不同构成重载,与返回类型无关。

 如:

Public class Name
{
	Public string GetName(string username)
	{
		Return username;
	}
Public int GetName(int usercount)
	{
		Return usercount;
	}
}

 二、重写

    1、示意

     重写(Override)指子类修改父类中某个函数的函数体,需要重写的父类中的函数必须是由virtual、abstract 或 override标注的,不能重写非虚方法或静态方法。

     Override是在继承的时候,如果你写的函数与要继承的函数函数特征(函数特征包括函数名,参数的类型和个数)相同,那么,加上这个关键字,在使用这个子类的这个函数的时候就看不见父类(或超类)的函数了,它被覆盖掉了。

   2、发生条件

     必须发生在基类和派生类中,基类函数必须用virtual、abstract 或 override修饰,派生类用override修饰。

   如:

    class Program
    {
        static void Main(string[] args)
        {
            oc oa=new ob();
            oa.b(1, 2);   //输出结果为fdfdf
        }
        public class oc
        {
            private int a;
	      //封装
            public int geta
            {
                get { return a; }
            }
            public int seta
            {
                set { a = value; }
            }
	     //函数b
            public virtual int b(int c, int e)
            {
                Console.WriteLine("{0}+{1}={2}", c, e, c + e);
                return c + e;
            }
        }
        //派生类ob,基类oc
        public class ob : oc
        {
	    //重写基类中的函数b
            public override int b(int c,int e)
            {
                Console.WriteLine("fdfdf");
                return c;
            } 
        }
}


 三、覆盖

   1、示意

    覆盖指重新定义子类中与父类具有相同函数特征的的函数体。子类中有一函数和父类中函数的函数特征相同,但函数体不同,称为覆盖。这种覆盖又称为隐藏,是隐藏父类中相同的函数,并没有进行重写。

   2、发生条件

    在子类中写一个和基类一样名字(参数不同也算)的非虚函数,会让基类中的函数被隐藏,编译后会提示要求使用New关键字。

如:

    class Program
    {
        static void Main(string[] args)
        {
            oc oa=new ob();
            oa.b(1, 2);  //输出结果为1+2=3
        }
        public class oc
        {
            private int a;
	     //封装
            public int geta
            {
                get { return a; }
            }
            public int seta
            {
                set { a = value; }
            }
	    //函数b
            public int b(int c, int e)
            {
                Console.WriteLine("{0}+{1}={2}", c, e, c + e);
                return c + e;
            }
        }
	//派生类ob,基类oc
        public class ob : oc
        {
	     //覆盖,隐藏基类中的函数b
            public new int b(int c,int e)
            {
                Console.WriteLine("fdfdf");
                return c;
            } 
        }
}

 四、总结

    重写(Override)的两个函数的函数特征相同,应用在子类和父类中,会重写父类函数;重载(Overload)的两个函数的函数名虽然相同,但函数特征不同,应用在同一类中;覆盖(new)两个函数的函数名一定相同,但函数特征可相同也可不相同,应用在子类和父类中,会隐藏父类同名函数。

    它们三者的在使用时还有很多需要注意的地方,在应用中慢慢积累吧,如果有不懂或不对的地方请留言互相交流哦。




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要将yyyy-MM-dd格式转换为yyyy/mm/dd格式,可以使用C#中的DateTime.ParseExact方法。首先,需要定义一个格式数组,其中包含可能出现的日期格式。例如,可以使用以下格式数组: string[] format = { "yyyy-MM-dd", "yy-MM-dd" }; 接下来,使用DateTime.ParseExact方法将字符串日期转换为DateTime对象。使用适当的格式数组和所需的区域设置。例如,使用以下代码进行转换: string dateStr = "2022-12-31"; // 输入的日期字符串 DateTime date = DateTime.ParseExact(dateStr, format, System.Globalization.CultureInfo.GetCultureInfo("en-US"), System.Globalization.DateTimeStyles.None); 最后,使用DateTime对象的ToString方法将日期以所需的yyyy/mm/dd格式转换为字符串。例如: string result = date.ToString("yyyy/MM/dd"); 这样,你可以将yyyy-MM-dd格式的日期字符串转换为yyyy/mm/dd格式的字符串。请注意,如果输入的日期字符串与指定的格式不匹配,将会引发异常。因此,确保提供的日期字符串与指定的格式相匹配,以避免出现异常。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* *2* [C#dd/MM/yyyy 格式转为yyyy/MM/dd 格式](https://blog.csdn.net/weixin_38950569/article/details/121351700)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值