• 1.隐藏继承的成员new / 虚方法(override)/ abstract / 多态 ----- 重写


    总结:

    1. 在继承上, new/override没区别

    2. 在多态上,new不支持多态,override支持

    在C#中改变类中相同名称的方法的实现过程中有三种方式:重载、重写和覆盖。

    重载指具有相同的方法名,通过改变参数的个数或者参数类型实现同名方法的不同实现。

    重写:则是只在继承中,子类通过override关键字修饰方法,实现父类和子类相同方法的不同实现,注意,父类方法必须是用virtual或者abstract关键字修饰的虚方法或者抽象方法

    覆盖:则是指在继承中,子类通过在与父类相同方法名之前用new修饰的一个新的方法的定义

    1.new ---- 子类隐藏父类的方法,覆盖(总结:new关键字不支持多态

    下面的例子我们可以发现new 关键字,并不支持多态的应用

    我们使用多态调用的任然还是父类中的方法,也就是被隐藏的方法

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Father fa = new Son();
                fa.print();
            }
        }
    
        class Father
        {
            public  void print()
            {
                Console.WriteLine("我是父类");
            }
        }
    
        class Son : Father
        {
            public new void print()
            {
                Console.WriteLine("我是子类");
            }
        }
    }

     输出:

    如果我们使用了多态创建了实例,要调用子类重写的方法,需要强制转换成子类类型,实例如下:

    class Program
        {
            static void Main(string[] args)
            {
                Father fa = new Son();
                Son so = (Son)fa;
                so.print();
            }
        }

    输出:

     

    2.virtual-- 重写 abstract--实现 (总结:这两种都支持多态)

    a.重写父类的方法要用到override关键字(具有override关键字修饰的方法是对父类中同名方法的新实现)
    b.要重写父类的方法,前提是父类中该要被重写的方法必须声明为virtual或者是abstract类型。(virtual修饰的可以有方法体,子类不一定要重写 abstract没有方法体,子类必须要实现)
    C.virtual关键字用于将方法定义为支持多态,有virtual关键字修饰的方法称为“虚拟方法”

    实例如下:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Father fa = new Son();
                fa.print();
            }
        }
    
        class Father
        {
            public virtual void print()
            {
                Console.WriteLine("我是父类");
            }
            
        }
    
        class Son : Father
        {
            public override void print()
            {
                Console.WriteLine("我是子类");
            }
        }
    }
    输出:

  • 相关阅读:
    C# WinForm 关于窗体最大化时的是否全屏效果与是否遮盖任务栏
    C# winform 无边框 窗体的拖动
    lenovo 联想笔记本ideapad 320c-15改装win7问题
    解决WIN7第一次开机冷启动QQ未响应的办法
    WIN10X64_LTSB2016极限精简版by双心
    RAMOS和SSD对比
    联想IDEAPAD 320C-15笔记本显卡驱动问题
    WIN7以上系统安装VB6的解决办法,附上个批处理。
    吐槽下银联1分钱乘公交
    QQ聊天框变成方框口口口口的解决办法
  • 原文地址:https://www.cnblogs.com/zjdbk/p/9274341.html
Copyright © 2020-2023  润新知