Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 子方法签名是否应该支持其父方法接受的所有参数?_Oop - Fatal编程技术网

Oop 子方法签名是否应该支持其父方法接受的所有参数?

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 如您所

下面是一些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
如您所见,如果有人决定使用
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