C# [method Modifiers] abstract virtual override new

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

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

 

 
相关文章
|
2月前
|
C#
C#中的overload,overwrite,override的语义区别
以上概念是面向对象编程中实现多态性和继承的重要基石。理解它们之间的区别对于编写清晰、可维护的代码至关重要。
92 7
|
2月前
|
C# 索引
C#中的virtual和override关键字
C#中的virtual和override关键字
39 3
|
5月前
|
C# 索引
C#学习相关系列之abstract和virtual用法
C#学习相关系列之abstract和virtual用法
C#学习virtual(虚拟的)和abstract(抽象的)的区别
C#学习virtual(虚拟的)和abstract(抽象的)的区别
100 0
|
Java 编译器 C#
C#中的override和new关键字
在 C# 中,派生类可以包含与基类方法同名的方法。 基类方法必须定义为 virtual。 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作。 如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。 如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。 可以从派生类中使用 base 关键字调用基类方法。
71 1
|
C#
C# 虚方法(virtual)案例详解
C# 虚方法(virtual)案例详解
199 3
|
C# 索引
走进C# abstract,了解抽象类与接口的异同
走进C# abstract,了解抽象类与接口的异同
105 0
C#(二十二)之抽象方法 密封方法 base new 关键字
本篇内容记录了普通方法的隐藏(new)、base关键字、抽象类和抽象方法(abstract)、密封类和蜜蜂方法(sealed)的简单用法。
124 0
C#(二十二)之抽象方法 密封方法 base new 关键字
|
设计模式 C#
C#(十九)之抽象类abstract
本篇内容记录了C#中的抽象类的一些特点。
247 0
C#(十九)之抽象类abstract
C#(十八)之C#虚方法virtual
C#中的继承,C#是面向对象语言,面向对象三种特性:封装、继承、多态。 这里主要是继承,本篇只是基础。
163 0
C#(十八)之C#虚方法virtual