How do you decide between using an Abstract Class and an Interface?
重复:接口与基类
我已经深入了解OOP、设计模式和ActionScript3的世界,我仍然好奇如何知道何时使用抽象类(不支持抽象类的AS3的伪类)和接口。对我来说,两者都只是作为模板,确保在给定的类中实现某些方法。区别仅仅在于抽象类需要继承,而接口只需要扩展吗?
谢谢,布瑞恩霍吉HoGeDev.com
如果您希望抽象类的子类具有某些功能,请使用抽象类。例如,如果您有一组您希望基本抽象类的所有子类都具有的函数。
如果您只是想要一个关于行为/功能的通用契约,那么就使用一个接口。如果您有一个函数或对象想要接受一组不同的对象,请使用一个接口。然后,您可以更改传入的对象,而不更改接受它的方法或对象。
与抽象类相比,接口通常是松散的。在您不断为接口的所有方法编写相同代码的情况下,您不希望使用接口。使用抽象类并定义每个方法一次。
另外,如果您试图创建一个特定的对象继承层次结构,那么您真的不希望只使用接口来实现这一点。
同样,在某些语言中,您只能有一个基类,如果对象已经有了一个基类,那么为了使用抽象的基类,您必须进行一些重构。这可能意味着,也可能不意味着您可能希望使用inteface。
正如@tvanfosson所指出的,使用很多接口并不是一个坏主意,当你真正理解抽象类和接口时,它并不是一种非此即彼的情况。特定情况下可以同时使用抽象类和接口,或者两者都不使用。有时我喜欢使用接口来限制方法或对象在传入参数对象上可以访问的内容。
正如@m4bwav所指出的,主要的区别在于抽象类可以(而且通常可以)为至少一些方法提供默认实现。这允许您使用抽象类来保持代码的干燥(不要重复您自己的代码),方法是将代码保持为从抽象类本身继承的所有类所共有的代码。
不过,我认为这是一个错误的困境。您不需要也可以说不应该在接口和抽象类之间进行选择。在大多数情况下,您希望定义接口,然后让抽象类提供一个默认的框架实现(如果需要)。对我来说,问题是我是否需要一个接口或接口以及一个抽象类,而不是一个接口或抽象类。使用该接口可以将代码与任何特定实现(甚至抽象类实现)分离。如果您应该选择使用另一个实现,那么使用该接口将允许这样做,而如果您只有抽象类,那么稍后必须重构以添加该接口。
我能看到的唯一不需要在这种情况下提供接口的情况是,您希望限制它,以便只使用您的实现。如果使用抽象类并且某些方法不是虚拟的,那么在实现者从类派生的所有情况下,都会强制使用代码。
抽象类提供了实现特定方法的可能性,并要求在继承类中实现其他方法。有了接口,所有东西都必须在实现类中实现。