Oop 子方法签名是否应该支持其父方法接受的所有参数?
下面是一些Ruby语法,但问题一般适用于面向对象设计 假设我有一个窗口类(如中的窗口,GUI窗口)。可以通过初始化位置及其大小来构造窗口Oop 子方法签名是否应该支持其父方法接受的所有参数?,oop,Oop,下面是一些Ruby语法,但问题一般适用于面向对象设计 假设我有一个窗口类(如中的窗口,GUI窗口)。可以通过初始化位置及其大小来构造窗口 class Window def initialize(x, y, width, height) end end 假设我有一个从基窗口继承的特定类型的窗口 class Scrolling_Window < Window def initialize(x, y) super(x, y, 200, 50) end end 如您所
class Window
def initialize(x, y, width, height)
end
end
假设我有一个从基窗口继承的特定类型的窗口
class Scrolling_Window < Window
def initialize(x, y)
super(x, y, 200, 50)
end
end
如您所见,如果有人决定使用Scrolling\u Window
中定义的很酷的方法,他们就必须复制这些方法并放弃从我的Scrolling\u Window
继承,或者找其他事情做
问题:
一般来说,将所有变量从孩子们透明地传递给他们的父母是否更好?“良好的OOP”设计是否指定了有关方法签名的任何内容
(这个例子的设计有问题,但我想不出更好的例子。)看看
派生类对象必须可替换为基类对象。这意味着派生类的对象的行为必须与基类契约中的承诺一致。
LSP是关于接口和契约,以及如何决定何时扩展一个类,而不是使用另一种策略,如组合来实现您的目标
在您的例子中,您关心的是方法签名,我想说,只要您的类仍然满足任何以前的契约和行为期望,那么就可以随意扩展、重载或更改
只要记住以上几点,你就会得出正确的结论。看一看
派生类对象必须可替换为基类对象。这意味着派生类的对象的行为必须与基类契约中的承诺一致。
LSP是关于接口和契约,以及如何决定何时扩展一个类,而不是使用另一种策略,如组合来实现您的目标
在您的例子中,您关心的是方法签名,我想说,只要您的类仍然满足任何以前的契约和行为期望,那么就可以随意扩展、重载或更改
只要记住上面的内容,你就会得出正确的结论。如果滚动窗口
打算用作基类,那么显然任何阻止派生类更改其维度的安排都是糟糕的设计。但无论如何,支持宽度和高度的成员肯定会受到保护
?特别是在Ruby中,让窗口自动调整大小是不可能的,但要阻止派生窗口这样做。@Jon:是这样吗?如果Scrolling\u Window
打算用作基类,那么当且仅当任何Scrolling\u Window
(即该类型和子类型的实例)有固定维度的原因时,它就必须防止派生类更改维度,这难道不是更好吗。参见类似“所有小部件的宽度和高度都可以自由调节,但文本框(一种特殊的小部件)的高度正好是一行文本(包括基本文本框和所有特殊的文本框子类型)”@O.R.Mapper:理论上,是的。但是如果是这样的话,那么滚动\u Window
将是一个非常糟糕的类名选择,因为我们确定这种类型的窗口有一些属性,要求它有一个固定的大小。该属性应反映在其类名中。此外,IMHO将“通用”滚动功能构建到一个特定的用例类中,这将进一步表明糟糕的设计。乔恩:在他们的命名空间的上下文中总是考虑标识符(我们在这里不知道)。尽管我同意,但如果滚动窗口打算用作基类,那么任何阻止派生类更改其维度的安排显然都是糟糕的设计。但无论如何,支持宽度和高度的成员肯定会受到保护
?特别是在Ruby中,让窗口自动调整大小是不可能的,但要阻止派生窗口这样做。@Jon:是这样吗?如果Scrolling\u Window
打算用作基类,那么当且仅当任何Scrolling\u Window
(即该类型和子类型的实例)有固定维度的原因时,它就必须防止派生类更改维度,这难道不是更好吗。参见类似“所有小部件的宽度和高度都可以自由调节,但文本框(一种特殊的小部件)的高度正好是一行文本(包括基本文本框和所有特殊的文本框子类型)”@O.R.Mapper:理论上,是的。但是如果是这样的话,那么滚动\u Window
将是一个非常糟糕的类名选择,因为我们确定这种类型的窗口有一些属性,要求它有一个固定的大小。该属性应反映在其类名中。此外,IMHO将“通用”滚动功能构建到一个特定的用例类中,这将进一步表明糟糕的设计。乔恩:在他们的命名空间的上下文中总是考虑标识符(我们在这里不知道)。不过我同意。
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