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

nd | | 访问(1747)

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

  一、抽象类概述及声明

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

  1:抽象类不能直接被实例化。

  2:抽象类中可以包含抽象成员,但非抽象类中不可以。

  3:抽象类不能被密封。

  二、抽象方法概述及声明

  声明抽象方法时需注意:

  1:抽象方法必须声明在抽象类中。

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

  3:在抽象类中抽象方法不提供实现。

  三、抽象类和接口的区别

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

  2:抽象类中可以定义成员的实现,但接口中不可以。

  3:抽象类中包含字段、构造函数、析构函数、静态成员或常量等,接口中不可以。

  4:抽象类中的成员可以私有的(只要不是抽象的)、受保护的、内部的或受保护的内部成员,但接口中的成员必须是公共的。

  抽象类和抽象方法实例

  using System;
  namespace Demo1
  {
    public abstract class ParentClass
    {
      public ParentClass()
      {
        Console.WriteLine("父类构造函数");
      }
      public abstract void SayHello();
      }
      public class ChildClass : ParentClass
      {
      public ChildClass()
      {
        Console.WriteLine("子类构造函数");
      }
      public override void SayHello()
      {
        Console.WriteLine("我是子类");
      }
      public static void Main()
      {
        ChildClass child = new ChildClass();
        child.SayHello();//显示"我是子类"
        Console.ReadKey();
      }
    }
  }

  如果不想把类声明为抽象类,但又想实现方法在基类里不具体实现,而是在派生类中重写实现功能,应该使用虚函数(virtual)实例如下:

  using System;
  namespace Demo2
  {
    public class ParentClass
    {
      public ParentClass()
      {
        Console.WriteLine("父类构造函数");
      }
      public virtual void SayHello()
      {
        //虚函数必须声明方法主体。抽象方法可以不需要
      }
    }
    public class ChildClass : ParentClass
    {
      public ChildClass()
      {
        Console.WriteLine("子类构造函数");
      }
      public override void SayHello()
      {
        Console.WriteLine("我是子类"); //隐藏了基类的成员
      }
      public static void Main()
      {
        ChildClass child = new ChildClass();
        child.SayHello();//显示"我是子类"
        Console.ReadKey();
      }
    }
  }

  C#不支持多继承,子类只能派生于一个父类,如果必须继承多个类的特性,使用接口可以实现多重继承。实例如下:

  using System;
  namespace Demo3
  {
    interface IFace1
    {
      void Say();
      void Hello();
    }
    interface IFace2
    {
      void Say();
      void Goodbye();
    }
    //派生类继承多个接口
    class FacetoFace : IFace1, IFace2
    {
      void IFace1.Say()//实现IFace1 成员
      {
        Console.WriteLine("这是IFace1的Say方法");
      }
      public void Hello()
      {
        Console.WriteLine("IFace1向您说Hello!");
      }
      void IFace2.Say()//实现IFace2 成员
      {
        Console.WriteLine("这是IFace2的Say方法");
      }
      public void Goodbye()
      {
        Console.WriteLine("IFace2向您说GoodBye");
      }
    }
    //调用
    class Program
    {
      static void Main(string[] args)
      {
        FacetoFace facetest = new FacetoFace();
        //将实例强制转换为相应接口类型IFace1
        ((IFace1)facetest).Say();
        //将实例强制转换为相应接口类型IFace2
        ((IFace2)facetest).Say();
        facetest.Hello();
        facetest.Goodbye();
        Console.ReadKey();
      }
    }
  }

热门评论

商品混凝土分析

商品混凝土分析

2013-08-26 17:59

文章写的很好 挺有帮助的 赞一个
顶(0)踩(0)回复(0)