温故知新(2)虚方法、隐藏方法、抽象类

来源:互联网 发布:game.min.js 编辑:程序博客网 时间:2024/06/01 10:37

虚方法:

1、virtual方法表示此方法可以被重写, 也就是说这个方法具有多态.父类中的方法是通用方法,可以在子类中重写以重新规定方法逻辑. 

2、virtual方法可以直接使用,和普通方法一样 

3、不是必须重写的. 子类可以使用base.方法 的方式调用, 无论有没有在子类使用override去重写virtual关键字只是明确标示此方法可以被重写, 其实它和一般的方法没有什么区别 

4、在子类中重写后,不管在哪里调用都是重写后的方法。重写之后,父类里的方法就不存在了(和隐藏方法相反)

5、相应的 sealed关键字标示此方法不可以被重写

virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。

virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。

除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。

在静态属性上使用 virtual 修饰符是错误的。

隐藏方法:

1、当子类里有一个方法和父类里的相同时,就会把父类里的方法隐藏

2、只是把父类里的方法隐藏了,实际上这个方法还从在

3、如果使用子类声明的对象,调用隐藏方法会调用子类里的,反之,使用父类声明对象,就会调用父类里的隐藏方法

抽象类:

1、C#允许把类/函数声明为abstract,抽象类不能被实例化

2、抽象函数本身也是虚拟的virtual,只有定义没有函数体(不能实现)

3、当一个类中有抽象方法时,那类也必须是抽象的

4、我们继承一个抽象类时,必须去实现抽象方法(重写override)

5、抽象类不可以构造,但可以声明

虚方法和抽象方法的区别:

1.虚方法可以有实现体,抽象方法不能有实现体。

2.抽象方法要求派生类必须重载这个方法;

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Test1{    public class MyClass    {        public void Fun()        {            Console.WriteLine("这是父类里的方法!");        }        public virtual void Fun1()        {            Console.WriteLine("这是父类里的虚方法!");        }    }    public class MyClass1 : MyClass    {        //隐藏方法        public void Fun()        {            Console.WriteLine("这是子类里的方法!");        }        //重写后的方法        public override void Fun1()        {           Console.WriteLine("这是我重写后的方法");        }    }    public abstract class MyClass2    {        public abstract void Fun();        public virtual void Fun1()        {            Console.WriteLine("我是抽象方法中的虚方法");        }    }    public class MyClass3 : MyClass2    {        public override void Fun()        {            Console.WriteLine("在子类里必须实现");        }    }    class Program    {        static void Main(string[] args)        {            //对应不同的类有不同的结果            MyClass myClass = new MyClass();            myClass.Fun();            myClass.Fun1();            MyClass1 myClass1 = new MyClass1();            myClass1.Fun();            myClass1.Fun1();            MyClass3 myClass3 = new MyClass3();            myClass3.Fun();            myClass3.Fun1();            Console.ReadKey();        }    }}


原创粉丝点击