我正在尝试将可靠的原则应用于我的项目,并且不确定如何处理以下场景:
我有一个接口:
IService和一个实现接口的类。
Service : IServiceIService中有许多方法,对于我的项目,我现在需要更新其中一个方法的功能,让我们称之为method1。
我对SOLID的理解是,我不应该更新method1,而是创建一个扩展Service (ServiceV2)和重写method1的新类。
我的问题是,ServiceV2应该只扩展Service,还是需要实现接口IService,然后只扩展Service和重写method1?
我问的主要原因是如果它实现了IService,这会影响到我的依赖注入(简单注入器),也就是说我只能注册一个实现IService的类
我想我不会做一个全新的IServcieV2和ServiceV2,因为这样会失去IService和IServicev2之间的关系。
另外,如果它只扩展了Service,我是否仍然实现依赖反转,因为新类并不直接实现接口,但我认为它是间接的?
发布于 2018-02-06 11:10:48
如果Service实现IService和Service2是从Service派生的,那么Service2会自动实现IService,因为IService只为特定的目的定义了一个类的签名中的部分&用于特定目的E 210。然后,使用这个类(或免费签名定义)创建一个类型,该类型反过来定义object的成员。
签名不会通过继承而改变。它只能被延长。这基本上是您应该使用继承的唯一一件事:
如果Service2.Method1()的可见行为与Service.Method1()的可见行为不同,这意味着Service2的可见行为不同于Service的可见行为。在这种情况下,您不应该使用继承,而是使用实现IService的新类。因为在这种情况下,它是一个不同的服务。
让我举一个具体的例子,尽管在不同的背景下:
从技术上讲,正方形是矩形的特例,这意味着Square : Rectangle。但是,如果正方形的长度发生变化,其宽度也会发生变化。矩形不是这种情况。因此,如果您有一个包含常规Rectangle和Square对象的Square对象(因为Square被定义为Rectangle的子对象),那么就会有不同的可见行为。因此,Square不能是Rectangle的子代,因为您不能使用Rectangle代替Square。所以Square : Rectangle是假的。您可以同时实现一个接口IGeometry,它将Length和Width定义为属性,并在List<IGeometry>中同时使用Rectangles和Squares。接口不指定行为。只是签名而已。
如果您有一个IConfigService,您同样可以将类FileConfigService和DatabaseConfigService定义为FileConfigService : IConfigService和DatabaseConfigService : IConfigService,并让类将它们保存为IConfigService,因为它们不需要关心任何类型的实现细节--它们只需要知道有几个方法和属性存在。这也是为什么你为每个“目的”创建一个界面,而不是为所有事情创建一个大的界面。以及为什么接口只定义公共成员。
这实质上是大多数固体的结果。
如果只向IService实现添加功能,则只更改这一个类。没有什么能阻止你。
不过,如果您有一个已经存在并正在运行的系统所依赖的you服务--在本例中,我将查看版本控制。
https://stackoverflow.com/questions/48640100
复制相似问题