什么是抽象类(Abstract)
抽象类就是声明为抽象的类,具有以下特点。
- 不能实例化,即不能new一个对象出来;
- 可以被继承;
- 可以包含抽象方法,也可以没有抽象方法(抽象方法是使用Abstract声明,但是没有实现);
- 可以有静态字段和静态方法;
- 非抽象子类必须实现所继承的抽象类的所有抽象方法;
下面是抽象类的示例。
abstract class SampleAbstract
{
public static string CommonInfo = "commoninfo";
private string privateInfo = "private Info";
public string Name { get; set; } = "";
public void ShowPrivateInfo()
{
Console.WriteLine(privateInfo);
}
public abstract void Method1();
}
什么是接口
本节主要摘自:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/interface
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/
接口定义了一个规定(contract,又称为合同等),任何类或者结构(struct)要实现这个接口,那么必须实现接口中的规定。
从C#8.0开始,接口可以定义默认实现。
为了描述本质信息,以下的说明都是基于C#8以下的版本。
接口具有以下特点。
- 具有方法、属性、索引器、事件等成员(默认为public,因此不用修饰符);
- 接口可以继承自一个类或者若干个接口(类必须排在第一位);
- 继承了接口的类或者结构必须实现接口的成员。
- 接口无法直接进行实例化。
下面看个例子。
public interface ISampleInterface
{
void TeSampleMethods();
}
class ImplementationClass:ISampleInterface
{
public void TeSampleMethods()
{
Console.WriteLine("I am Implementation.");
}
}
有两种使用方法。
static void Main(string[] args)
{
ISampleInterface obj1 = new ImplementationClass();
obj1.TeSampleMethods();
ImplementationClass obj2 = new ImplementationClass();
obj2.TeSampleMethods();
Console.Read();
}
执行结果。
In the following example, class ImplementationClass must implement a method named SampleMethod that has no parameters and returns void.
For more information and examples, see Interfaces.
Example
接口和抽象类的异同点
参考自以下。
https://www.geeksforgeeks.org/difference-between-abstract-class-and-interface-in-c-sharp/
抽象类 | 接口 |
---|---|
包含声明和定义(实现) | 仅包含声明 |
不能进行多继承(一个类最多只能继承自一个抽象类) | 能进行多个继承 |
包含构造器(构造函数) | 不能包含构造函数 |
可以包含静态成员 | 不能包含静态成员 |
可以包含各种修饰符,如public、private、protected等 | 只包含public类型,因为接口中的任何成员都是public |
抽象类运行较快 | 接口运行较慢,因为需要时间搜索相应的类的实际方法 |
可以包含方法、常量、字段等 | 只能包含方法类型(方法、属性等) |
包含的方法可以全部实现、部分实现或者不实现(子类也是抽象类,则可以部分实现父类的抽象方法) | 方法必须全部实现 |
如何选择使用
从上节的抽象类和接口异同,可以得到如下结论:
- 如果需要实现多个类的内在共同特征(通过常量、字段、非抽象方法等体现),使用抽象类;如果主要体现实现类的外部功能(共同的方法),使用接口;
其它参考资料
https://dzone.com/articles/when-to-use-abstract-class-and-intreface