可能“抽象类和接口之间的区别”是 .Net 世界中最常见的问题。我将解释理论上的差异,然后是代码 sn-p。
根据我的理论,抽象类和接口之间基本上有5个区别,如下所示:-
一个类可以实现任意数量的接口,但一个子类最多只能使用一个抽象类。
抽象类可以有非抽象方法(具体方法),而在接口的情况下,所有方法都必须是抽象的。
抽象类可以声明或使用任何变量,而接口不允许这样做。
所以下面的代码不会编译:-
接口测试接口
{
int x = 4; // Filed Declaration in Interface
void getMethod();
string getName();
}
抽象类TestAbstractClass
{
int i = 4;
int k = 3;
public abstract void getClassName();
}
它会产生一个编译时错误:-
错误 1 接口不能包含字段。
所以我们需要省略字段声明才能正确编译代码。
接口测试接口
{
void getMethod();
string getName();
}
抽象类TestAbstractClass
{
int i = 4;
int k = 3;
public abstract void getClassName();
}
上面的代码可以正确编译,因为接口中没有字段声明。
4.抽象类可以有构造函数声明,而接口不能有。
所以下面的代码不会编译:-
接口测试接口
{
// Constructor Declaration
public TestInterface()
{
void getMethod();
string getName();
}
}
抽象类TestAbstractClass
{
public TestAbstractClass()
{
int i = 4;
int k = 3;
public abstract void getClassName();
}
}
上面的代码会产生一个编译时错误:-
错误 1 接口不能包含构造函数
所以我们需要在接口中省略构造函数声明才能编译我们的代码。
以下代码完美编译:-
接口测试接口
{
void getMethod();
string getName();
}
抽象类TestAbstractClass
{
public TestAbstractClass()
{
int i = 4;
int k = 3;
public abstract void getClassName();
}
}
5.一个抽象类允许对其所有成员声明具有所有访问修饰符,而在接口中我们不能声明任何访问修饰符(包括公共),因为接口的所有成员都是隐式公共的。
注意:这里我说的是接口成员的访问说明符,而不是接口。
下面的代码会更好地解释它:-
提供访问说明符为 Public 是完全合法的(记住只允许 public)
公共接口TestInterface
{
void getMethod();
string getName();
}
以上代码编译完美。
不允许给接口的成员任何访问说明符。
接口测试接口
{
public void getMethod();
public string getName();
}
上面的代码会产生一个编译时错误:-
错误 1 修饰符“public”对此项无效。
但声明接口的最佳方式是避免接口上的访问说明符以及接口的成员。
接口测试
{
void getMethod();
string getName();
}