如何构建基本的类层次结构?
我将以C++作为示范语言,因为它在继承和类方面非常依赖。
这里是一个简单的指南,介绍如何为简单的操作系统(例如windows)构建控件。
控件包括在您的窗口上的简单对象,例如按钮、滑块、文本框等。
构建基本类。
这部分指南适用于(几乎)任何类。
记住,计划得好就是做了一半。
我们正在处理哪种类别?
它的特性是什么,需要哪些方法?
这些是我们需要考虑的主要问题。
我们在这里正在处理操作系统控件,因此让我们从一个简单的类开始,它应该是Button
。现在,我们的按钮有哪些属性呢?显然,它需要一个窗口上的位置
。此外,我们不想让每个按钮都有一样的大小,因此大小
是另一个属性。还需要一个标签
(在按钮上绘制的文本)。对每个类别进行这样的设计,然后编写它。现在我知道我需要哪些属性,那么让我们建立这个类。
class Button { private: Point m_position; Size m_size; std::string m_label; }
请注意,为了代码更短,我省略了所有的getter和setter和其他方法,但你可能也需要包括它们。我也期望我们需要Point
和Size
类,通常我们需要自己定义它们。
接下来是下一个类别。
现在,我们已经完成了一个类别(Button
),我们可以转到下一个类别。
让我们来看看Slider
,它是帮助您上下滚动网页的条形杆。
让我们像处理按钮一样开始,我们的滑块类别需要什么?
它在窗口上有一个位置
和滑块的大小
。此外,它有最小和最大值(最小值意味着滚动条设置为滑块的顶部,最大值意味着它在底部)。我们还需要当前值,即滑块此时所在的位置。现在就够了,我们可以构建我们的类别:
class Slider { private: Point m_position; Size m_size; int m_minValue; int m_maxValue; int m_currentValue; }
创建一个基础类。
现在我们有了两个类别,我们注意到,我们只在两个类别上定义了Point m_position;
和Size m_size;
属性。这意味着我们有两个具有共同元素的类,我们重复编写了相同的代码,如果我们只需要编写一次,然后告诉我们的两个类使用那些代码,那不是很棒吗?但是,我们可以实现它。
如果我们有两个具有共同属性的类别(在这种情况下是Button
和Slider
),那么创建一个基础类是“总是”(有例外,但初学者不必担心)推荐的。它们都是我们操作系统上的控件,具有大小
和位置
。从此得到一个新类,称为Control
:
class Control { private: Point m_position; Size m_size; }
从共同基类继承相似的类。
现在我们有了Control
类,其中包括每个控件的共同项目,我们可以让我们的Button
和Slider
继承它。这将节省我们时间、计算机内存和最终的时间。以下是我们的新类:
class Control { private: Point m_position; Size m_size; } class Button : public Control { private: std::string m_label } class Slider : public Control { private: int m_minValue; int m_maxValue; int m_currentValue; }
有些人可能会说,写两次Point m_position; Size m_size;
比写两次: public Control
和创建Control
类容易多了。在某些情况下,这可能是正确的,但仍然建议不要重复编写相同的代码,特别是在创建类时。
此外,谁知道我们最终会发现多少共同属性。稍后我们可能会意识到需要在Control
类中添加Control* m_parent
成员,该成员指向包含我们的控件所在的窗口(或面板等)。
另外一个问题是,如果我们后来意识到除了Slider
和Button
之外,我们还需要TextBox
,我们只需通过class TextBox : public Control {...}
创建文本框控件,并且只编写特定于文本框的成员变量,而不是在每个类中反复编写大小、位置和父项。
最终思考。
基本上,每当您有两个具有共同属性或方法的类时,都应创建一个基类。这是基本规则,但您可以使用自己的头脑,因为可能有一些例外情况。
我自己也不是专业程序员,但我正在学习,并且我已经教给您了我所受过的教育者教给我的一切。我希望您(或至少其他人)会发现这个答案有用。即使有些人说Python和其他鸭子类型的语言甚至不需要使用继承,他们也是错的。在大型项目中使用继承将节省您大量时间和金钱,最终您会感谢自己创建基础类。您的项目的可重用性和管理将变得更加容易。