OCP,是客户端还是抽象class层级open-closed?

OCP, is the client or the abstract class hiearchy open-closed?

很抱歉标题可能令人困惑,我找不到更合适的标题。 我正在学习开放封闭原则。 一些作者提到这实际上是 OCP - 基础 class 已关闭,并且正在通过派生 classed:

中的新内容进行扩展
abstract class A {}
class B : A {}
class C: {}

然后别人说其实是依赖那些classes的代码不需要再改了,因为它依赖抽象。所以我有点困惑。

有一个我喜欢的例子:http://www.oodesign.com/open-close-principle.html

它是用 Java 写的,但尽管如此,希望它是可读的。我也爱Uncle Bob Martin seminar on SOLID principles.

OCP 的作用是让代码可以扩展到新功能。现在举个例子,假设你有:

abstract class A {
   public string GetString(string str) {
      return Format(str);
   }

   public virtual string Format(string str) { return str; };
}

class B: A {
   public override string Format(string str) { return $"%{str}%"; }
}

假设抽象 class A 在库中并且您正在使用它,但想使用某种格式化方法 Format 进行扩展。现在,这不是最好的真实示例,您可能会为此目的使用格式化 class。但是关于OCP,我们已经关闭修改class A,我们可以扩展它。另一件事是不遵循 Liskov 替换原则并且不破坏 A class.

的 Format 方法