首页 > 编程笔记 > C#笔记

C#抽象类和抽象方法

如果一个类不与具体的事物相联系,而只是表达一种抽象的概念或行为,仅仅是作为其子类的一个父类,这样的类就可以声明为抽象类。

例如,去商场买衣服,这句话描述的就是一个抽象的行为。到底去哪个商场买衣服,买什么样的衣服,是短衫、裙子,还是其他的衣服?在“去商场买衣服”这句话中,并没有对“买衣服”这个抽象行为指明一个确定的信息。如果要将“去商场买衣服”这个动作封装为一个行为类,那么这个类就是一个抽象类。

C# 中声明抽象类时需要使用 abstract 关键字,具体语法格式如下:
访问修饰符 abstract class 类名 [: 父类或接口]
{
    //类成员
}
在声明抽象类时,除 abstract 关键字、class 关键字和类名外,其他的都是可选项。

抽象类主要用来提供多个子类可共享的父类的公共定义,它与非抽象类的主要区别如下:
由于抽象类本身不能直接实例化,因此很多人认为在抽象类中声明构造函数是没有意义的。其实不然,即使我们不为抽象类声明构造函数,编译器也会自动为其生成一个默认的构造函数。抽象类中的构造函数主要有以下两个作用:
在抽象类中定义的方法,如果加上 abstract 关键字,就是一个抽象方法。抽象方法不提供具体的实现。引入抽象方法的原因在于抽象类本身是一个抽象的概念,有的方法并不需要具体的实现,而是留下让子类来重写实现。

在声明抽象方法时需要注意以下两点:
例如声明一个抽象类,并在该抽象类中声明一个抽象方法。代码如下:
public abstract class TestClass
{
     public abstract void AbsMethod();//抽象方法
}
在 C# 中,类中只要有一个方法被声明为抽象方法,则这个类必须被声明为抽象类。

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

【实例】使用抽象类模拟“去商场买衣服”的案例,然后通过子类继承确定到底去哪个商场买衣服,买什么样的衣服。代码如下:
public abstract class Market
{
     public string Name { get; set; }//商场名称
     public string Goods { get; set; }//商品名称
     public abstract void Shop();//抽象方法,用来输出信息
}
public class LNMarket : Market//继承抽象类
{
     public override void Shop()//重写抽象方法
     {
          Console.WriteLine(Name + " 购买 " + Goods);
     }
}
public class TaobaoMarket : Market//继承抽象类
{
     public override void Shop()//重写抽象方法
     {
          Console.WriteLine(Name + " 购买 " + Goods);
     }
}
class Program
{
      static void Main(string[] args)
      {
             Market market = new LNMarket();//使用子类对象创建抽象类对象
             market.Name = "李宁实体店";
             market.Goods = "跑步运动背心";
             market.Shop();
             market = new TaobaoMarket();//使用子类对象创建抽象类对象
             market.Name = "淘宝";
             market.Goods = "牛仔裤";
             market.Shop();
             Console.ReadLine();
      }
}
程序运行结果为:

李宁实体店 购买 跑步运动背心
淘宝 购买 牛仔裤

相关文章