首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用固体原理

应用固体原理
EN

Stack Overflow用户
提问于 2018-02-06 09:55:28
回答 1查看 399关注 0票数 0

我正在尝试将可靠的原则应用于我的项目,并且不确定如何处理以下场景:

我有一个接口:

代码语言:javascript
复制
IService

和一个实现接口的类。

代码语言:javascript
复制
Service : IService

IService中有许多方法,对于我的项目,我现在需要更新其中一个方法的功能,让我们称之为method1

我对SOLID的理解是,我不应该更新method1,而是创建一个扩展Service (ServiceV2)和重写method1的新类。

我的问题是,ServiceV2应该只扩展Service,还是需要实现接口IService,然后只扩展Service和重写method1

我问的主要原因是如果它实现了IService,这会影响到我的依赖注入(简单注入器),也就是说我只能注册一个实现IService的类

我想我不会做一个全新的IServcieV2ServiceV2,因为这样会失去IServiceIServicev2之间的关系。

另外,如果它只扩展了Service,我是否仍然实现依赖反转,因为新类并不直接实现接口,但我认为它是间接的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-06 11:10:48

如果Service实现IServiceService2是从Service派生的,那么Service2会自动实现IService,因为IService只为特定的目的定义了一个类的签名中的部分&用于特定目的E 210。然后,使用这个类(或免费签名定义)创建一个类型,该类型反过来定义object的成员。

签名不会通过继承而改变。它只能被延长。这基本上是您应该使用继承的唯一一件事:

如果Service2.Method1()的可见行为与Service.Method1()的可见行为不同,这意味着Service2的可见行为不同于Service的可见行为。在这种情况下,您不应该使用继承,而是使用实现IService的新类。因为在这种情况下,它是一个不同的服务。

让我举一个具体的例子,尽管在不同的背景下:

从技术上讲,正方形是矩形的特例,这意味着Square : Rectangle。但是,如果正方形的长度发生变化,其宽度也会发生变化。矩形不是这种情况。因此,如果您有一个包含常规RectangleSquare对象的Square对象(因为Square被定义为Rectangle的子对象),那么就会有不同的可见行为。因此,Square不能是Rectangle的子代,因为您不能使用Rectangle代替Square。所以Square : Rectangle是假的。您可以同时实现一个接口IGeometry,它将LengthWidth定义为属性,并在List<IGeometry>中同时使用RectanglesSquares。接口不指定行为。只是签名而已。

如果您有一个IConfigService,您同样可以将类FileConfigServiceDatabaseConfigService定义为FileConfigService : IConfigServiceDatabaseConfigService : IConfigService,并让类将它们保存为IConfigService,因为它们不需要关心任何类型的实现细节--它们只需要知道有几个方法和属性存在。这也是为什么你为每个“目的”创建一个界面,而不是为所有事情创建一个大的界面。以及为什么接口只定义公共成员。

这实质上是大多数固体的结果。

如果只向IService实现添加功能,则只更改这一个类。没有什么能阻止你。

不过,如果您有一个已经存在并正在运行的系统所依赖的you服务--在本例中,我将查看版本控制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48640100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档