C#抽象类和抽象方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#抽象类和抽象方法相关的知识,希望对你有一定的参考价值。

如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类,在抽象类中声明方法时,如果加上abstract时就是抽象方法


  1. 抽象类概述及声明


抽象类与非抽象类的主要区别:


①.抽象类不能直接被实例化


②.抽象类中可以只有抽象方法,也可以只有非抽象方法,也可以抽象方法、非抽象方法都有。(非抽象     类中不能有抽象方法)。


③.抽象类不能被密封


以上会在下面例子中一一验证:

    class Program

    {

        static void Main(string[] args)

        {

            M m = new M();//错误提示:无法创建抽象类或接口M的实例。验证了①,抽象类和接口不能被实例化


        }

    }


    public abstract class M

    {

        public void A()

        {

            Console.WriteLine("调用了A方法");

        }


        public abstract void B() //错误提示:M.B()无法声明主体,因为它标记为abstract。也就是说,抽象方


法不能有方法体。

        {

            Console.WriteLine("调用了B方法");

        }


        public abstract void G();

    }


    public class C

    {

        public abstract void H();//错误提示:C.D()是抽象的,但它包含在非抽象类C中。再对比 M 类中的方法A()、B()来看,就验证了②:非抽象类中不能有抽象方法;抽象类中可以只有抽象方法,也可以只有非抽象方法,也可以抽象方法、非抽象方法都有。


        public void D()

        {


        }

     

    }


    public sealed abstract class E //错误提示:E 是抽象类,它不能是密封(sealed)或静态(static)的。这就验证了③。

    {


    }


    public static abstract class F //错误提示:F 是抽象类,它不能是密封(sealed)或静态(static)的。这就验证了③。

    {


}


2.抽象方法概述及声明


声明抽象方法时需注意:


①.抽象方法必须声明在抽象类中(上面已经验证)。  

②.声明抽象方法时,不能使用virtual、static、private修饰符。

③.在抽象类中抽象方法不提供实现。


下面例子中会一一验证:

    class Program

    {

        static void Main(string[] args)

        {

        }

    }


    public abstract class M

    {

        public abstract void A();


        public virtual abstract void B();//错误提示:抽象方法 B 不能标记为 virtual。因为虚方法和抽象方法属于同一个等级的,并列关系。


        public static abstract void C();//错误提示:静态成员 C不能标记为overrid、virtual或abstract。


        private abstract void D();  //错误提示:虚拟成员或抽象成员不能是私有的。因为虚拟成员是让继承类来override的,如果是private,继承类都不能看见;抽象方法要是私有的话,这个抽象方法所在的抽象类的子类就没法实现这个抽象方法,看不见。


        A();//抽象方法在自己的抽象类中不能有方法体,所以不能在本类中实现。要在继承类中实现。


    }


3.抽象类与抽象方法的使用


直接举例子:


using System;

using System.Collections.Generic;

using System.Text;

namespace _

{

    public abstract class myClass

    {

        private string id = "";

        private string name = "";

        /// <summary>

        /// 编号属性及实现

        /// </summary>

        public string ID

        {

            get

            {

                return id;

            }

            set

            {

                id = value;

            }

        }

        /// <summary>

        /// 姓名属性及实现

        /// </summary>

        public string Name

        {

            get

            {

                return name;

            }

            set

            {

                name = value;

            }

        }

        /// <summary>

        /// 抽象方法,用来输出信息

        /// </summary>

        public abstract void ShowInfo();

    }


    public class DriveClass:myClass                     //继承抽象类

    {

        /// <summary>

        /// 重写抽象类中输出信息的方法

        /// </summary>

        public override void ShowInfo()

        {

            Console.WriteLine(ID + " " + Name);

        }

    }


    class Program

    {

        static void Main(string[] args)

        {

            //实例化派生类

            DriveClass driveclass = new DriveClass();  

           

            //使用派生类对象实例化抽象类

            myClass myclass = driveclass;    

           

            //使用抽象类对象访问抽象类中的编号属性           

            myclass.ID = "BH0001";

          

            //使用抽象类对象访问抽象类中的姓名属性                 

            myclass.Name = "TM";                        

           

            //使用抽象类对象调用抽象类中的的抽象方法

            myclass.ShowInfo();                         

        }

    }

}


上例中通过派生类的对象driveclass来实例化抽象类,然后使用抽象类访问抽象类中的属性及方法。


以上是关于C#抽象类和抽象方法的主要内容,如果未能解决你的问题,请参考以下文章

c#中的行为抽象类和接口是啥? [复制]

C#中的抽象类和接口[重复]

C#中的抽象类抽象方法和虚方法

C#抽象类及其方法的学习

scala 抽象类和trait的区别

C#抽象类及其方法的学习