开闭原则是否意味着我们必须将每个方法都定义为虚拟的?

Does Open Closed Principle mean that we have to define every method as virtual?

我无法理解开放封闭原则背后的想法。

据我所知,原理是说每一个class都应该对修改关闭,对扩展开放。对吗?

所以这意味着我们必须使 class 中的每个方法都是虚拟的,这样我们就可以扩展 class 而无需修改它。这是正确的吗?

我认为您对开闭原则的含义有些误​​解。

开闭原则指出,软件实体应该对修改关闭,对扩展开放。此上下文中的软件实体是指 classes、结构方法等

基本思想是您的实体不需要经常根据要求进行更改。如果出现新要求,您的实体应该扩展以适应新功能。

假设我们有以下函数:

    public List<Product> GetProducts(Criteria criteria)
    {
        return context.Where(x => x.criteria1 = criteria.criteria1)
            .Where(x => x.criteria2 = criteria.criteria2)
            .Where(x => x.criteria3 = criteria.criteria3)
            .Where(x => x.criteria4 = criteria.criteria4);
    }

很容易看出,当另一个标准要求出现时,这将需要修改 "ProductRepository" class 及其功能。当然,这个 class 中的更多函数可能需要修改,因为它也可能使用条件对象。

假设我们可以这样写:

    private List<Product> GetProducts(Criteria criteria)
    {
        return cleverContext.Apply(criteria);
    }

我们立即获得了灵活性,只需修改或扩展负责标准的代码。

改进设计以满足开闭原则的最大方法是使用丰富的域。当您的域为企业业务规则建模时,规则永远不应该改变。我们将 Domain 与 Use-Cases 分开来处理应用程序规则。

bob 叔叔在他的 clean architecture 中写了更多这方面的内容。

让我知道是否有任何我可以阐明的内容,或者尝试进一步解释:)