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 方法
很抱歉标题可能令人困惑,我找不到更合适的标题。 我正在学习开放封闭原则。 一些作者提到这实际上是 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 方法