1. 抽象类
抽象类是C#中一种特殊的类,可以被看作是对其他类的一种基础模板或蓝本。在抽象类中可以包含抽象方法和非抽象方法,而抽象方法只有声明,没有实现。抽象类本身是不能被实例化的。
1.1 抽象方法
抽象方法是指方法的声明只包含函数原型,没有函数体。它相当于一种半成品的方法,需要在继承抽象类的子类中实现。抽象方法的声明以abstract
关键字开始。
下面是一个使用抽象类的例子,通过一个Person
类和它的两个子类Student
和Teacher
来说明:
public abstract class Person
{
public abstract void GetInfo();
}
public class Student : Person
{
public override void GetInfo()
{
Console.WriteLine("I am a student.");
}
}
public class Teacher : Person
{
public override void GetInfo()
{
Console.WriteLine("I am a teacher.");
}
}
上面的代码中,Person
是一个抽象类,其中只包含了一个抽象方法GetInfo()
。Student
和Teacher
是两个继承自Person
的子类,它们都实现了GetInfo()
方法。
1.2 非抽象方法
除了抽象方法之外,抽象类中还可以包含非抽象方法,也就是有函数体的方法。非抽象方法可以被子类直接继承或者覆盖,不需要在子类中再次声明。下面是一个包含抽象方法和非抽象方法的抽象类的例子:
public abstract class Shape
{
public abstract double GetArea();
public virtual void Print()
{
Console.WriteLine("This is a shape.");
}
}
public class Circle : Shape
{
double radius;
public Circle(double r)
{
radius = r;
}
public override double GetArea()
{
return Math.PI * radius * radius;
}
}
上面的代码中,Shape
是一个包含抽象方法GetArea()
和非抽象方法Print()
的抽象类。Circle
是Shape
的一个子类,它实现了GetArea()
方法,而Print()
方法直接继承了父类。
2. 接口
接口是一组方法的集合,不包含任何字段、构造函数和实现。它定义了一种协议,一组可供实现它的类或结构使用的方法和事件。接口可以看作是对多重继承的一种解决方案,也可以用来实现面向对象程序设计中的多态和抽象。一个类可以同时实现多个接口。
下面是一个使用接口的例子,通过IShape
接口和Circle
类来说明:
public interface IShape
{
double GetArea();
}
public class Circle : IShape
{
double radius;
public Circle(double r)
{
radius = r;
}
public double GetArea()
{
return Math.PI * radius * radius;
}
}
上面的代码中,IShape
是一个接口,Circle
是它的一个实现类,它实现了接口中定义的GetArea()
方法。
2.1 显式实现接口方法
一个类可以实现多个接口,如果两个或以上的接口具有相同名称的方法,则必须用显示实现接口成员来避免冲突。显式实现接口方法的语法为:
接口名.成员名
例如下面这个示例:
public interface IFirst
{
int GetData();
}
public interface ISecond
{
int GetData();
}
public class MyClass : IFirst, ISecond
{
int IFirst.GetData()
{
return 1;
}
int ISecond.GetData()
{
return 2;
}
}
上面的代码中,MyClass
类实现了IFirst
接口和ISecond
接口,并且这两个接口具有相同名称的方法GetData()
。由于这种情况下编译器无法区分要调用哪个接口的方法,因此需要用显式实现接口成员的方式来实现这两个方法。
2.2 接口继承
与类一样,接口也可以进行继承。接口之间采用逗号分隔可以实现多继承。下面是一个使用接口继承的例子:
public interface IShape
{
double GetArea();
}
public interface IColor
{
string GetColor();
}
public interface IShapeColor : IShape, IColor
{
}
public class Circle : IShapeColor
{
double radius;
string color;
public Circle(double r, string c)
{
radius = r;
color = c;
}
public double GetArea()
{
return Math.PI * radius * radius;
}
public string GetColor()
{
return color;
}
}
上面的代码中,IShape
和IColor
是两个接口,IShapeColor
是它们的继承接口,Circle
是它的一个实现类。Circle
类实现了IShapeColor
接口中定义的GetArea()
方法和GetColor()
方法。