C# - 界面澄清

时间:2009-10-03 05:22:59

标签: c# oop

我读了一些关于界面的观点:

“ 接口是类必须符合的合同的定义。它不是 继承任何东西。 “

在定义接口和抽象类之间的差异时,我可以说:

当一个类派生自抽象类时,它被称为真正的继承。当一个类使用接口时,它不是继承,它是契约的实现吗?

7 个答案:

答案 0 :(得分:3)

是的,你是对的。界面只是一个合同。

注意:接口不是从任何 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)
        {       
        }
        }

答案 1 :(得分:2)

是..你只是总结一下

什么是抽象类?

抽象类是一种无法实例化的特殊类。所以问题是为什么我们需要一个无法实例化的类?抽象类只是被分类(继承自)。换句话说,它只允许其他类继承它但不能实例化。优点是它为所有子类强制执行某些层次结构。简单来说,它是一种强制所有子类继承相同层次结构或标准的契约。

什么是界面?

接口不是类。它是由Interface这个词定义的实体。接口没有实现;它只有签名或换言之,只是没有正文的方法的定义。作为与Abstract类相似的一个,它是一个契约,用于为所有子类定义层次结构,或者它定义特定的方法集及其参数。它们之间的主要区别在于类可以实现多个接口,但只能从一个抽象类继承。由于C#不支持多重继承,因此接口用于实现多重继承。

一起

当我们创建一个接口时,我们基本上创建了一组方法,没有必须被实现的类覆盖的任何实现。它的优点是它为类提供了一种方法,使其成为两个类的一部分:一个来自继承层次结构,另一个来自接口。

当我们创建一个抽象类时,我们正在创建一个可能有一个或多个已完成方法的基类,但至少有一个或多个方法未完成并声明为抽象。如果抽象类的所有方法都未完成,那么它与接口相同。抽象类的目的是为一组派生类如何工作提供基类定义,然后允许程序员填充派生类中的实现。

答案 2 :(得分:1)

  

当一个类使用接口时,它就是   不是继承,它是一种   合同的实施

是的,这就是它的确切方式。

如果你研究一个接口继承另一个接口会发生什么,这可能会更清楚一点。这可能令人困惑,因为我们只是说接口它不是继承而是合同定义。如果您使用以下代码:

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() { }
}

如果你检查类BAB的IL代码(使用ildasm或类似代码),你会发现当它们实现哪些接口时,两个类是相同的。接口IB用作“快捷方式”以包含接口IA,但传统意义上没有继承。

答案 3 :(得分:1)

  

当一个类派生自抽象时   它被称为真实的   继承。当一个类使用时   界面然后它不是   继承,它是一个实现   合同?

答案 4 :(得分:1)

抽象类和接口之间的区别在于接口不定义任何此方法的实现,而抽象类提供了一些实现。这是唯一的区别。抽象类和具体类之间的区别在于抽象类至少有一个成员没有提供实现。

接口可以从其他接口派生。

只有接口允许多重继承,原因是复杂的原因和前一时代宗教战争的一部分。

答案 5 :(得分:1)

如果您研究使用这两个关键字时,最好理解抽象类和界面之间的区别:

本质上,接口是一个定义代码契约的特殊构造。在创建它时,它不能包含任何实现;它只是指定合同所需的属性和方法的签名。当类实现接口时,它必须提供与合同中指定的完全相同的每个属性和方法。实现类负责提供实现。

然而,抽象类可以自由地提供它想要或需要的尽可能多的实现。它本身可以实现一个接口。抽象类所需要的只是标记为abstract。通过在抽象(基类)类中标记方法virtual并在派生类中使用overrides关键字,可以通过派生类覆盖其成员。但抽象基类没有义务提供任何功能;也没有义务提供缺乏实施的最少数量的虚拟方法。

希望这有帮助!

答案 6 :(得分:0)

接口正在定义接口。想想接口这个词。

简单。

它定义了你与班级的交互方式(界面!)。

只需将你的大脑重新安排回来,你就会看到答案就在你面前。