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.抽用作基类,无法实例化

  • 相关阅读:
    C#序列化效率对比
    将聚合记录集逆时针和顺时针旋转90度(行列互换)
    Sql的行列转换
    log4net配置
    input框添加阴影效果
    WCF自定义地址路由映射(不用svc文件)
    Jquery对当前日期的操作(格式化当前日期)
    用JQuery获取输入框中的光标位置
    sublime text3安装后html:5+Tab不能快速生成html头部信息的解决办法
    js获取url传递参数,js获取url?号后面的参数
  • 原文地址:https://www.cnblogs.com/xran/p/3175365.html
Copyright © 2011-2022 走看看