为什么抽象工厂使用抽象类而不是接口
本文关键字:接口 抽象类 抽象 工厂 为什么 | 更新日期: 2023-09-27 18:31:36
我正在学习设计模式,书中的第一个例子是关于抽象工厂的。我已经在 VS 中构建了练习,一切看起来都不错,但有一个问题我想知道。
在书中,工厂类是这样实现的:
public abstract class AbstractVehicleFactory
{
public abstract IBody CreateBody();
public abstract IChassis CreateChassis();
public abstract IGlassware CreateGlassware();
}
完成练习后,我注意到上面的类可以用以下代码替换:
public interface IAbstractVehicleFactory
{
IBody CreateBody();
IChassis CreateChassis();
IGlassware CreateGlassware();
}
当然,这两个示例的功能完全相同,但我想知道使用抽象类而不是接口的原因是什么?
"
抽象工厂"中的"抽象"与abstract class
中的"抽象"无关。抽象工厂是混凝土工厂的"基础",但设计模式本身并不强制任何特定的实现。抽象工厂可以是抽象的,甚至是具体的类、接口或某种形式的鸭子类型对象,具体取决于您使用的语言。
实际上,在 C# 中interface
指定抽象工厂是非常合理的方法。
抽象类可以小心地以不间断的方式扩展;对接口的所有更改都是中断性更改。
更新:
相反,接口可以是 in 或 out 类型参数,而抽象类不能。有时一个或另一个更适合给定的设计,有时它是一个折腾。
界面确实是最优雅的方式。
使用抽象类的参数:有时,当类保持状态并且某些部分已知时,使用抽象类可能很有用。
但是,首先使用接口,然后选择性地实现引入这种状态的抽象类更安全。由于C#
只允许单个继承,因此当ConcreteFactory
应该从不同的类继承时,可能会遇到麻烦。
这可能是书中的一个错字,第一个"接口"实际上是一个抽象类。
没有所谓的"抽象接口"。根据定义,接口是抽象的。