2014-01-31 32 views
0

我从一些网站上看到一篇文章,并在那篇文章中我读到:abstract class和interface在C#

抽象类能在不破坏使用旧版本的子类添加更多的功能。在一个接口中,由于必须实现类的接口方法,附加函数的创建将影响其子类。

我不明白这是什么意思。任何人都可以更具体地解释这个,与很好的例子

这就是我读Link

+2

想象一下,为接口添加一个新方法。所有实现者都需要更新以提供实现。源代码和二进制文件都被破坏。现在为抽象基类添加一个新方法。在派生类中什么都不需要改变(......或多或少)。 _没有destroying_意味着在这种情况下,抽象基类将保持与现有代码/程序集的源代码和二进制兼容性,并且接口将破坏(破坏...)。 –

+0

我认为这意味着如果你使用的是接口,所有的子类必须在接口中实现新的方法。如果你正在使用抽象类,你的子类可以在没有任何改变的情况下编译,因为如果它不是抽象的,就不必重写抽象方法或自动继承方法。 – Sebi

+0

@Adriano是否正确answere([Not comment](http://stackoverflow.com/help/privileges/comment):-)) – pravprab

回答

3

因为接口只定义类型必须实现的成员,所以向接口添加任何新成员将会破坏实现旧版本的任何类,因为它本质上不会实现新成员。每当你改变一个接口的定义时,你都必须改变实现该接口的每一个类。将抽象成员添加到抽象类中对派生类的作用相同,但是如果将虚拟成员添加到抽象类中,那么它将不会对派生类产生影响。他们可以改变来覆盖那个成员,但他们不需要。

2

它的意思是,如果你考虑一个抽象类被叫电话 ,它有3个虚拟功能,即 AddPhonePrice,AddAccessoryPrice文章,AddAuxillaryPrice

,如果有两个子类 1)SamsungPhone 2)Iphone

现在SamsungPhone将实现所有3个功能。 而iPhone将拥有执行只AddPhonePrice,因为他们不提供其他任何与手机

如果我们把接口称为IMainPhone与 AddPhonePrice,AddAccessoryPrice,AddAuxillaryPrice功能

然后SamsungPhone和iPhone都需要实现所有3个功能 ,不管他们是否需要他们。

1

这意味着您可以将新成员(方法,属性,字段,...)添加到抽象类,不会导致在派生类的变化 - 只要成员不是抽象的,这是正确的。例如,考虑下面的例子:

internal abstract class MyBaseClass 
{ 
    public abstract void DoSomething(); 

    // This method can also be added later without having an effect on the derived classes 
    public virtual void DoSomethingElse() 
    { 
     // Do something else... 
    } 
} 

internal class MyDerivedClass : MyBaseClass 
{ 
    public override void DoSomething() 
    { 
     // Do something... 
    } 
} 

在这种情况下,派生类必须实现的方法DoSomething。但您可以稍后将非抽象函数添加到抽象基类。但是,只要将另一个抽象成员添加到基类中,这也会影响所有非抽象派生类,因为必须实现新成员。

在另一方面,接口不界定在所有的具体实现但只包含抽象的签名实现者都必须提供。因此,如果向接口添加新成员(方法,属性),则会强制接口的所有实现者也提供新成员的实现。

0

接口:当你添加一个方法到接口类,那么你必须(手动)确保所有衍生类实现该方法。

摘要基地:当你添加一个方法来抽象基地类,你不需要编译器来实现该方法在派生类。

相关问题