我正在学习设计模式,本书的第一个例子是关于抽象工厂。 我已经在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();
}
当然这两个例子的功能完全相同,但我想知道使用抽象类而不是接口的原因是什么?
答案 0 :(得分:7)
“摘要”与abstract class
中的“摘要”无关。抽象工厂是混凝土工厂的“基础”,但设计模式本身并不强制执行任何特定的实施。抽象工厂可以是抽象的,甚至是具体的类,接口或某种形式的鸭型对象,具体取决于您使用的语言。
确实在C#中interface
是指定抽象工厂的非常合理的方法。
答案 1 :(得分:6)
抽象类可以小心翼翼地以不间断的方式扩展;对界面的所有更改都会发生变化。
<强>更新强>:
相反,界面可以是 in 或 out 类型参数,而抽象类则不能。有时候一个或另一个更适合给定的设计,有时它是一个折腾。
答案 2 :(得分:4)
界面确实是最优雅的方式。
使用抽象类的参数:有时,当类维护状态并且某些部分已知时,使用抽象类会很有用。
然而,首先使用接口然后可选地实现引入此类状态的抽象类更安全。由于C#
只允许单继承,因此当ConcreteFactory
应该从不同的类继承时,可能会遇到麻烦。
答案 3 :(得分:3)
这可能是书中的一个错字,第一个“界面”实际上是一个抽象类。
没有“抽象界面”这样的东西。根据定义,接口是抽象的。