1

维基说

在依赖倒置的直接应用中,抽象由上层/策略层拥有。该架构将较高/策略组件和定义较低服务的抽象组合在同一个包中。较低级别的层是通过这些抽象类或接口的继承/实现来创建的。

理想情况下,正如维基文章所说(在实现部分下的方法 2 中)抽象模块应该是松散耦合的单独模块,

但是我对引用声明的方法1有疑问。根据我的经验,无论 2 没有实现/可能,我总是看到抽象类是用低级模块而不是高级模块打包的。

用高级包封装抽象/接口的缺点是,如果有 10 个高级模块调用给定的低级模块,那么我们需要将接口打包在所有 10 个模块中。考虑到我必须在界面中添加一个方法,我必须修改所有 10 个模块才能添加该方法。不是吗?因此,根据我的理解,抽象类应该与低级模块而不是高级模块一起打包。

纠正我如果我在这里错了吗?

4

1 回答 1

0

我不同意你的观点,“我总是看到抽象类是用低级模块而不是高级模块打包的”。如果你看到了同样的情况,那么这个类设计肯定是错误的。

让我们将抽象与现实世界的示例进行比较。假设您有一个电气开关/插座,将其视为抽象/接口或高级模块。Socket 不知道它连接到哪个设备。在这种情况下,设备是低级模块。事实上,socket(高级模块)不想知道它连接到哪些低级模块(设备)。任何与该套接字兼容的设备都可以连接到它。兼容性是一种实现抽象(socket)。只有那些设计用于连接该套接字的设备才能连接到套接字。假设为印度设计的设备无法连接到英国插座。现在,如果高级模块知道低级模块,则相当于为每个设备设计套接字,因为在这种情况下,设备不是基于抽象的。

现在回答您在发生更改时对所有类实现接口的问题,有时我们无法避免它,但是在设计抽象时不要让它变胖(接口隔离原则)。从逻辑上对接口进行分组,而不是将所有内容放在一个接口中。在设计界面时,要多次考虑分组。我仍然同意我们最终会为接口添加更多行为,最终会在类中实现它。但是,如果我们在一个逻辑组中设计交互,那么该实现将是所有类都需要的。

于 2017-09-20T11:31:03.877 回答