我从MSDN文章中得到了以下声明。文章表明,抽象类比接口具有优势,因为可以修改抽象类以添加新成员。改变抽象类是否会使继承自它的类不稳定?或者有人能否解释一下他们的观点?
请尽量定义类而非接口。在您程序库的后续版本中,您可以安全地向类中添加新成员;但是,无法向接口中添加成员而不破坏现有代码。
请尽量定义类而非接口。在您程序库的后续版本中,您可以安全地向类中添加新成员;但是,无法向接口中添加成员而不破坏现有代码。
假设您有一个接口
public interface Animal
{
void Sleep();
}
当您发布您的库并发现需要向接口添加属性时。
public interface Animal
{
int Age{get;set;}
void Sleep();
}
public abstract class Animal
{
public abstract void Sleep();
}
public abstract class Animal
{
public virtual int Age{get;set;}
public abstract void Sleep();
}
IExample
)。 在程序的第二个版本中,你意识到IExample
应该有一个名为IExample.NewMethod
的方法。 如果你扩展了IExample
以添加此方法,则之前编写的所有代码都将无法正常工作,因为从IExample
继承的所有类都不会完全实现此接口 - 因此代码将无法编译。 只针对这种情况讨论是正确的。可以通过使用从IExample
继承的新接口(INewExample
)或者创建没有继承关系的新接口来解决此问题。Circle
是一个Shape
,因此您可以将Circle
从抽象的Shape
继承),但是从Car
继承Circle
是非常糟糕的想法,即使它们具有相同的接口。
如果想要了解接口VS抽象类的完整概述,我建议您阅读肯特·贝克的书和《代码大全》以了解继承的一般情况。
abstract
成员总是virtual
,因此virtual
涵盖了两种情况)。考虑具有属性A
、B
和C
的类Base
。如果一个类Derived : Base
包含成员D
,然后Base
添加了virtual
成员D
,那么Derived
现在将编译出警告,就像http://msdn.microsoft.com/en-us/library/aa288479(v=vs.71).aspx中的`Meth3`示例一样。 - Adam Mihalcin抽象类
最大的优点是可以拥有内部成员,而接口
则不行。另一方面,你可以在接口
上实现多重继承,但在抽象类
上则不行。
抽象类的优点在于可以实现通用功能。使用接口时,每个实现类都必须提供其定义操作的自己实现。