抽象类主要用来提供多个派生类可共享的基类的公共定义,它与非抽象类的主要区别如下:
- 抽象类不能直接实例化。
- 抽象类中可以包含抽象成员,但非抽象类中不可以。
- 抽象类不能被密封。
C#中声明抽象类时需要使用 abstract 关键字,具体语法格式如下:
访问修饰符 abstract class 类名:基类或接口
{
//类成员
}
说明:声明抽象类时,除 abstract 关键字、class 关键字和类名外,其他的都是可选项。
【例1】声明一个抽象类,该抽象类中包含一个 int 类型的变量和一个无返回值类型的方法。
public abstract class myClass
{
public int i;
public void method() { }
}
二、抽象方法概述及声明
抽象方法就是在声明方法时,加上 abstract 关键字,声明抽象方法时需要注意以下两点。
- 抽象方法必须声明在抽象类中。
- 声明抽象方法时,不能使用 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。
四、抽象类与接口
抽象类和接口都包含可以由派生类继承的成员,它们都不能直接实例化,但可以声明它们的变量。如果这样做,就可以使用多态性把继承这两种类型的对象指定给它们的变量。接着通过这些变量来使用这些类型的成员,但不能直接访问派生类中其他成员。
抽象类和接口的区别主要有以下几点:
- 它们的派生类只能继承一个基类,即只能直接继承一个抽象类,但可以继承任意多个接口。
未完待续……