zoukankan      html  css  js  c++  java
  • 面向对象-多态 附抽象

    面向对象有三大特征:继承,封装,多态。
    什么是多态?
    多态就是对象可以表现多个类型的能力
    实现多态有三种手段:
    1、虚方法
    2、抽象类
    3、接口
    一、虚方法
    看一段代码

    namespace 多态
    {
        public class Program
        {
            static void Main(string[] args)
            {
                Person p = new Person("人类");
                p.Show();
                Chinese china = new Chinese("中国人");
                p.Show();
                Console.ReadKey();
            }
        }
        public class Person
        {
            public string Name { get; set; }
    
            public Person(string name)
            {
                this.Name = name;
            }
            public void Show()
            {
                Console.WriteLine("我叫{0}", this.Name);
            }
        }
    
        public class Chinese : Person
        {
            public Chinese(string name)
                : base(name)
            {
            }
            public void Show()
            {
                Console.WriteLine("我叫{0}",base.Name);
            }
        }
    
        public class Japanese : Person
        {
            public Japanese(string name)
                : base(name)
            { }
            public void Show()
            {
                Console.WriteLine("我是{0}",base.Name);
            }
        }
    }

    可以发现其中的方法名字跟父类的名字一样。运行的时候发现子类方法报绿线错误,
    如果子类的方法跟子类的方法名相同,那么子类会默认的将父类的方法隐藏掉,解决方法有两种
    1.new关键字

    1).new的作用:隐藏子类从父类继承过来的方法。

    //子类的类
      public class Japanese : Person
        {
            public Japanese(string name)
                : base(name)
            { }
    //方法这里加一个new关键字
            public new void Show()
            {
                Console.WriteLine("我是{0}",base.Name);
            }
        }

    2。使用虚方法
    1)、将父类的方法标记为virtual 表示这个父类的方法可以被子类重写

    //父类的方法
     public class Person
        {
            public string Name
            {
                get;
                set;
            }
            public Person(string name)
            {
                this.Name = name;
            }
    //父类的方法加virtual 
            public virtual void SayHello()
            {
                Console.WriteLine("大家好,我叫{0},我是人类", this.Name);
            }
        }

    2)、将子类的方法标记为override  表示重写父类的方法

    //子类的方法
     public class Chinese : Person
        {
            public Chinese(string name)
                : base(name)
            {
    
            }
    //子类的方法中加override 实现虚方法
            public override void SayHello()
            {
                Console.WriteLine("大家好,我叫{0},我是中国人", this.Name);
            }
        }

    虚方法与重写
    1、方法不能用static修饰
    2、方法重写与基类的签名必须一致
    3、virtual不能与private一起使用
    4.虚方法为什么不能加static因为 虚方法是父类,加static,那么就是类调用这个方法,和对象无关了,那子类就调不了.

    常见虚方法:Equal()ToString()GetHashCode()
    override与重载(overload)的区别 
    重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要。重载(overload)是面向过程的概念。Override 是进行基类中函数的重写。Override是面向对象的概念
    二、抽象类抽象类与抽象方法由abstract修饰abstract的使用注意1,抽象方法没有方法体2.抽象成员只能存在于3.抽象类中抽象类可以有非抽象成员4.抽象类的派生类必须实现抽象方法体5.抽用作基类,无法实例化

  • 相关阅读:
    程序员副业那些事:聊聊出书和录视频
    跳槽时,不敢要高工资也会对候选人不利
    SQL 查询今天、昨天、7天内、30天的数据
    jquery table按列名称排序
    Asp.Net微信js分享
    表格插件BootStrap-Table使用教程
    ASP.NET中IOC容器Autofac(依赖注入DI 控制反转IOC)
    IIS添加MIME类型.woff/.svg/.woff2/.eot/.otf.ttf
    div垂直居中水平居中css
    Asp.Net报https请求报传输流收到意外的 EOF 或 0 个字节
  • 原文地址:https://www.cnblogs.com/xran/p/3175365.html
Copyright © 2011-2022 走看看