这是一些Ruby语法,但这个问题一般适用于面向对象的设计。
假设我有一个Window类(窗口,如GUI窗口)。您可以通过初始化位置及其大小来构建窗口。
class Window
def initialize(x, y, width, height)
end
end
假设我有一个特定类型的窗口继承自基础Window
。
class Scrolling_Window < Window
def initialize(x, y)
super(x, y, 200, 50)
end
end
请注意,我的意图是绘制具有固定大小的窗口,但您可以自由选择窗口的放置位置。它具有很酷的滚动功能以及“常规窗口”不应该具有的其他功能,因为它们不是设计用于滚动窗口。
现在如果有人想继承Scrolling_Window
,因为他们想要创建一种滚动窗口,有自己的一些额外功能,但希望减少“限制”签名
class Another_Window < Child_Window
def initialize(x, y, width, height)
super(x, y)
# oops, now the width and height are pretty much stuck
end
end
正如您所看到的,如果有人决定使用Scrolling_Window
中定义的酷方法,他们就不得不复制方法并放弃继承我的Scrolling_Window
,或者找不到别的事情要做。
透明地将所有变量从孩子传递给父母通常会更好吗? “良好的OOP”设计是否指定了方法签名的任何内容?
(这个例子是有问题的设计,但我想不出更好的例子。)
答案 0 :(得分:1)
查看Liskov substitution principle
Derived class objects must be substitutable for the base class objects. That means objects of the derived class must behave in a manner consistent with the promises made in the base class' contract.
LSP是关于接口和合同以及如何决定何时扩展一个类而不是使用另一个策略(如合成)来实现您的目标。
在你的情况下,你担心方法签名,我会说,只要你的班级仍然满足任何先前的合同和行为期望,然后随意延长,超载或改变。</ p>
请记住上述内容,您将得出正确的结论。