.NET 中的抽象类和抽象方法

如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类,在抽象类中声明方法时,如果加上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();
    }
  }
}
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值