【C#】——抽象类与抽象方法

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

抽象类主要用来提供多个派生类可共享的基类的公共定义,它与非抽象类的主要区别如下:

  1. 抽象类不能直接实例化。
  2. 抽象类中可以包含抽象成员,但非抽象类中不可以。
  3. 抽象类不能被密封。

C#中声明抽象类时需要使用 abstract 关键字,具体语法格式如下:

访问修饰符 abstract class 类名:基类或接口

{

        //类成员

}

说明:声明抽象类时,除 abstract 关键字、class 关键字和类名外,其他的都是可选项。

【例1】声明一个抽象类,该抽象类中包含一个 int 类型的变量和一个无返回值类型的方法。

public abstract class myClass
    {
        public int i;
        public void method() { }
    }

二、抽象方法概述及声明

抽象方法就是在声明方法时,加上 abstract 关键字,声明抽象方法时需要注意以下两点。

  1. 抽象方法必须声明在抽象类中。
  2. 声明抽象方法时,不能使用 virtual 、static 和 private 修饰符。

抽象方法声明引入了一个新方法,但不提供该方法的实现,由于抽象方法不提供任何实际实现,因此抽象方法的方法体只包含一个分号。

当从抽象类派生一个非抽象类时,需要在非抽象类中重写抽象方法,以提供具体的实现,重写抽象犯法时使用 override 关键字。

【例2】声明一个抽象类,该抽象类中声明一个抽象方法。

public abstract class myClass
    {
        public abstract void method();  //抽象方法
    }

三、抽象类与抽象方法的使用

【例3】创建一个控制应用程序,其中声明一个抽象类 myClass ,该抽象类中声明了两个属性和一个方法,其中,为两个属性提供了具体实现,方法为抽象方法。然后声明一个派生类 DriveClass,继承自 myClass,在DriveClass 派生类中重写 myClass 抽象类中的抽象方法,并提供具体的实现。最后在主程序类 Program 的 Main 方法中实例化 DriveClass 派生类的一个对象,使用该对象实例化抽象类,并使用抽象类对象访问抽象中的属性和派生类中重写的方法。

public abstract class myClass
    {
        private string id = "";
        private string name = "";
        public string ID
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        public abstract void ShowInfo();
    }
    public class DriveClass : myClass
    {
        public override void ShowInfo()
        {
            Console.WriteLine(ID + "" + Name);
        }
        class Program
        {
            static void Main(string[] atgs)
            {
                DriveClass driveclass = new DriveClass();
                myClass myclass = driveclass;
                myclass.ID = "BH001";
                myclass.Name = "TM";
                myclass.ShowInfo();
            }
        }
    }

运行结果为 BH001 TM。

四、抽象类与接口

抽象类和接口都包含可以由派生类继承的成员,它们都不能直接实例化,但可以声明它们的变量。如果这样做,就可以使用多态性把继承这两种类型的对象指定给它们的变量。接着通过这些变量来使用这些类型的成员,但不能直接访问派生类中其他成员。

抽象类和接口的区别主要有以下几点:

  1. 它们的派生类只能继承一个基类,即只能直接继承一个抽象类,但可以继承任意多个接口。

未完待续……

猜你喜欢

转载自blog.csdn.net/cangsheng45/article/details/79781596