zoukankan      html  css  js  c++  java
  • 抽象方法、虚方法小结

    abstract :表示方法是抽象方法,在子类中必须重写。抽象方法所在的类必须是抽象类,即用abstract modifiers;
    virtual:表示此方法是virtual方法,除了在子类中可以重写外(在子类中也可直接使用),和普通方法完全一样;
    override:表示重写父类的virtual方法;
    new: 显式隐藏从基类继承的成员;

    区别:

    virtual:标记方法为虚方法
    1.可在派生类中以override覆盖此方法
    2.不覆盖也可由对象调用
    3.无此标记的方法(也无其他标记),重写时需用new隐藏原方法
    abstract 与virtual : 方法重写时都使用 override 关键字

    如果子类重写了父类的虚方法,那么通过父类变量来调用这个方法的时候会调用子类的,如果没有,则会调用父类的

    Eg1:

       public abstract class Book
        {
            public Book()
            {
            }
            public abstract void getPrice(); //抽象方法,不含主体
            public virtual void getName() //虚方法,可覆盖
            {
                Console.WriteLine("this is a test:virtual getName()");
            }
            public virtual void getContent() //虚方法,可覆盖
            {
                Console.WriteLine("this is a test:virtual getContent()");
            }
            public void getDate() //一般方法,若在派生类中重写,须使用new关键字
            {
                Console.WriteLine("this is a test: void getDate()");
            }
        }
    
        public class ChineseBook : Book
        {
            public override void getPrice() //实现抽象方法,必须实现
            {
                Console.WriteLine("this is a test:ChineseBook override abstract getPrice()");
            }
            public override void getName() //覆盖原方法,不是必须的
            {
                Console.WriteLine("this is a test:ChineseBook override virtual getName()");
            }
            public new void getDate() {
                Console.WriteLine("this is a test:ChineseBook new getDate()");
            }
    
            public void Run() {
                getPrice();
                getName();
                getContent();
                getDate();
            }
    
        }

    Output:

    this is a test:ChineseBook override abstract getPrice()
    this is a test:ChineseBook override virtual getName()
    this is a test:virtual getContent()
    this is a test:ChineseBook new getDate()

    Eg2:

     public abstract class FlowModel
        {
           public abstract void A();
    
           public virtual void B(){
               Console.WriteLine("Orginal B()");
           }
    
           public virtual void C(){
               Console.WriteLine("Orginal C()");
           }
    
           public void D(){
               Console.WriteLine("Orginal D()");
           }
    
        }
    
    
       public class Flow:FlowModel
       {
           public override void A()
           {
               //执行步骤A
               Console.WriteLine("Execute Step A ");
           }
    
           public virtual void B()
           {
               //执行步骤B
               Console.WriteLine("Execute Step B");
           }
    
           public void C()
           {
               //执行步骤C
               Console.WriteLine("Execute Step C");
           }
    
           public new void D() {
               Console.WriteLine("Execute Step D");
           }
    
    
           public void Run()
           {
               A();
               B(); //步骤B是扩展点 ,可以由子类决定具体执行什么
               C();
               D();
           }
       }
    Output:

    Execute Step A
    Execute Step B
    Execute Step C
    Execute Step D

  • 相关阅读:
    委托、Lamda表达式
    springcloud-feign的hystrix支持
    springcloud-断路器hystrix
    Java原子性、可见性、内存模型
    volatile特性
    synchronized实现可见性
    Js四则运算精度问题处理
    docker 简单安装java web项目
    elasticsearch 分布式集群搭建
    logstash-input-jdbc同时同步多个表
  • 原文地址:https://www.cnblogs.com/xuekai-to-sharp/p/3369667.html
Copyright © 2011-2022 走看看