如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类,在抽象类中声明方法时,如果加上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();
}
}
}