C#中的抽象类与接口的详解

1. 抽象类

抽象类是C#中一种特殊的类,可以被看作是对其他类的一种基础模板或蓝本。在抽象类中可以包含抽象方法和非抽象方法,而抽象方法只有声明,没有实现。抽象类本身是不能被实例化的。

1.1 抽象方法

抽象方法是指方法的声明只包含函数原型,没有函数体。它相当于一种半成品的方法,需要在继承抽象类的子类中实现。抽象方法的声明以abstract关键字开始。

下面是一个使用抽象类的例子,通过一个Person类和它的两个子类StudentTeacher来说明:

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()StudentTeacher是两个继承自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()的抽象类。CircleShape的一个子类,它实现了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;

}

}

上面的代码中,IShapeIColor是两个接口,IShapeColor是它们的继承接口,Circle是它的一个实现类。Circle类实现了IShapeColor接口中定义的GetArea()方法和GetColor()方法。

后端开发标签