繁体   English   中英

C#中的抽象类和接口

[英]Abstract Class and Interface in C#

我从某个站点阅读了一篇文章,在该文章中,我读到了以下内容:

抽象类可以添加更多功能,而不会破坏使用旧版本的子类。 在接口中,由于必须对类实现接口方法,因此创建其他函数将对其子类产生影响。

我不明白这是什么意思。 谁能用一个好榜样 更具体地解释这一点

这是我阅读的文章链接

因为接口仅定义类型必须实现的成员,所以将任何新成员添加到接口将破坏实现旧版本的任何类,因为它固有地不实现新成员。 每次更改接口的定义时,都必须更改实现该接口的每个类。 将抽象成员添加到抽象类中对派生类也是如此,但是如果将虚拟成员添加到抽象类中,则对派生类没有影响。 可以更改它们以覆盖该成员,但不必这样做。

这意味着如果您考虑一个名为Phone的抽象类,它具有3个虚函数,即AddPhonePrice,AddAccessoryPrice,AddAuxillaryPrice

以及是否有两个子类1)SamsungPhone 2)Iphone

现在,三星手机将实现所有这三个功能。 而Iphone仅可用于AddPhonePrice,因为它们不提供电话其他功能

如果我们使用AddPhonePrice,AddAccessoryPrice和AddAuxillaryPrice函数创建名为IMainPhone的接口

那么SamsungPhone和Iphone都将需要实现所有这三个功能,而不管它们是否需要。

这意味着您可以将新成员(方法,属性,字段等)添加到抽象类中,而这些新类不会导致派生类发生更改-只要成员不是抽象,这是正确的。 例如,考虑以下示例:

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方法。 但是您可以稍后将非抽象函数添加到抽象基类中。 但是,将另一个抽象成员添加到基类后,这也将影响所有非抽象派生类,因为必须实现新成员。

另一方面,接口根本不定义具体的实现,而仅包含所有实现者必须提供的抽象签名。 因此,如果将新成员(方法,属性)添加到接口,则会强制该接口的所有实现者也提供新成员的实现。

接口:将方法添加到基本接口类时,必须(手动)确保所有派生类都实现该方法。

抽象基类:将方法添加到抽象类时,编译器不需要在派生类中实现该方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM