开闭原则和继承的区别

Pra*_*kar 3 polymorphism inheritance abstraction open-closed-principle solid-principles

我知道开闭原则意味着对扩展开放,对修改封闭。考虑如下示例

public class Vehicle{
    public void service(){
        //vehicle servicing code
    }
}

public class Bike extends Vehicle{

    public void service(){
        // bike specific servicing 
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我明白Bike该类Vehicle使用开放封闭原则扩展并添加了新功能。

考虑我创建Vehicle类的jar 文件,然后类从 jarBike扩展Vehicle类。在这种情况下,我们不能修改Vehicle类并Bike扩展它。这是开闭原则的一个很好的例子吗?我想知道 OCP 与继承有何不同

prz*_*_li 8

以下是我对 OCP 解读的看法:

OCP 指出,可以根据代码更改的频率对代码进行分类,并且“相同”代码的各个部分可以具有不同的更改频率,我所说的更改不仅是指随着时间的推移而更改,还包括运行时的更改——例如选择这个或执行某些操作的特定代码段。

OCP 要求将更稳定的代码与更可能更改的代码分开。但它并不止于此,它还要求较不频繁更改的代码能够与较频繁更改的代码一起工作。

那么OCP == 继承吗?不。继承只是用于实现 OCP 的技术之一。策略模式、装饰器模式、普通组合、参数多态(又名泛型)和其他技术也可用于实现这些目标。

我所说的不同变化频率的含义示例。让我们想象一些集合实现。如果每次在语言中添加一些原始类型,集合代码也需要更新,这不是很糟糕吗?因此,集合将它们持有的项目视为不透明的,从而实现 OCP。下一个示例,让我们采用与上一个示例相同的集合实现,并假设我们要打印已排序的元素。简单的。我们将只为一个集合添加排序......还有其他 10 种集合类型?每个新系列也必须实现那种类型?可怕。如果我们的排序算法只是将集合视为不透明类型,如果被询问将按顺序提供它的项目,那不是更好吗?这是我们的排序需要集合做的唯一事情,一旦给定元素列表,它可以进行实际排序。好的。所以现在集合只需要支持一个连续返回所有项目的操作。容易……如果我们仔细想想,这是一个非常有用的行为,可以用于过滤、转换……

希望通过上面的例子,我展示了一些超越继承的 OCP 用法,并表明 OCP 还鼓励我们将我们的代码视为不同抽象级别的组合(具有不同变化频率的代码组合)。