![](/img/trans.png)
[英]C# interface concept clarification with IActionResult in ASP.NET Core
[英]C# - Interface Clarification
我读了一些关于界面的观点:
虽然定义接口和抽象类之间的差异,我可以说:
当一个类派生自抽象类时,它被称为真正的继承。当一个类使用接口时,它不是继承,它是一个契约的实现?
是的,你是对的 。 界面只是一个合同。
注意:接口不派生自任何System.Object派生类型。 接口只是一个抽象类型,由一组虚方法组成,每个方法都有自己的名称,参数和返回类型。 接口方法不能包含任何实现; 因此,接口类型是不完整的(抽象)。
例如:
interface I1
{
}
interface I2
{
}
abstract class a1
{
}
abstract class a2
{
}
class App:a1,I1,I2 //no Error
{
static void Main(string[] args)
{
}
}
注意:CLR允许类型仅从一个其他类型继承,该类型具有System.Object作为其根基类型
interface I1
{
}
interface I2
{
}
abstract class a1
{
}
abstract class a2
{
}
class App:a1,a2,I1,I2 // Error
{
static void Main(string[] args)
{
}
}
是的..你只是总结一下
什么是抽象类?
抽象类是一种无法实例化的特殊类。 所以问题是为什么我们需要一个无法实例化的类? 抽象类只是被分类(继承自)。 换句话说,它只允许其他类继承它但不能实例化。 优点是它为所有子类强制执行某些层次结构。 简单来说,它是一种强制所有子类进行相同层次结构或标准的契约。
什么是界面?
接口不是类。 它是由Interface这个词定义的实体。 接口没有实现; 它只有签名或换言之,只是没有正文的方法的定义。 作为与Abstract类相似的一个,它是一个契约,用于为所有子类定义层次结构,或者它定义特定的方法集及其参数。 它们之间的主要区别在于类可以实现多个接口,但只能从一个抽象类继承。 由于C#不支持多重继承,因此接口用于实现多重继承。
两者一起
当我们创建一个接口时,我们基本上创建了一组方法,没有必须被实现的类覆盖的任何实现。 它的优点是它为类提供了一种方法,使其成为两个类的一部分:一个来自继承层次结构,另一个来自接口。
当我们创建一个抽象类时,我们正在创建一个可能有一个或多个已完成方法的基类,但至少有一个或多个方法未完成并被声明为abstract。 如果抽象类的所有方法都未完成,那么它与接口相同。 抽象类的目的是为一组派生类如何工作提供基类定义,然后允许程序员填充派生类中的实现。
当一个类使用接口时,它不是继承,它是一个契约的实现
是的,这就是它的确切方式。
如果你研究一个接口继承另一个接口会发生什么,这可能会更清楚一些。 这可能令人困惑,因为我们只是说接口它不是继承而是合同定义。 如果您使用以下代码:
interface IA
{
void MethodA();
}
interface IB : IA
{
void MethodB();
}
class B : IB
{
public void MethodA() { }
public void MethodB() { }
}
class AB : IA, IB
{
public void MethodA() { }
public void MethodB() { }
}
如果你检查类B
和AB
的IL代码(使用ildasm或类似代码),你会发现当它们实现哪些接口时,两个类是相同的。 接口IB
用作“快捷方式”以包括接口IA
,但是在所涉及的传统意义上没有继承。
当一个类派生自抽象类时,它被称为真正的继承。当一个类使用接口时,它不是继承,它是一个契约的实现?
抽象类和接口之间的区别在于接口不定义任何此方法的实现,而抽象类提供了一些实现。 这是唯一的区别。 抽象类和具体类之间的区别在于抽象类至少有一个成员未为其提供实现。
接口可以从其他接口派生。
由于复杂的原因和前一个时代的宗教战争的一部分,仅允许接口进行多重继承。
如果您研究使用的两个关键字,最好理解抽象类和接口之间的区别:
本质上, 接口是一个定义代码契约的特殊构造。 创建它时,它不能包含任何实现; 它只是指定合同所需的属性和方法的签名。 当类实现接口时,它必须提供与合同中指定的完全相同的每个属性和方法。 实现类负责提供实现。
但是, 抽象类可以根据需要或需要随意提供尽可能多的实现。 它本身可以实现一个接口。 抽象类所需要的只是它被标记为abstract
。 通过在abstract(base)类中标记virtual
方法,并在派生类中使用overrides
关键字,可以通过派生类覆盖其成员。 但抽象基类没有义务提供任何功能; 也没有义务提供缺乏实施的最少数量的虚拟方法。
希望这可以帮助!
接口正在定义接口。 想想接口这个词。
简单。
它定义了您与类的交互方式(界面!)。
只需将你的大脑重新转移到自己身上,你就会看到答案就在你面前。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.