如何构建基本的类层次结构?

10 浏览
0 Comments

如何构建基本的类层次结构?

输出内容缺失

admin 更改状态以发布 2023年5月22日
0
0 Comments

当你有两个包含一个单一类的属性或者其中一个类依赖于另一个类的情况时,你需要使用继承。例如:

class animal:
    #something
class dog(animal):
    #something
class cat(animal):
    #something

这里有两个类,狗和猫,它们有类动物的属性。这时候,继承起到了作用。

class parent:
    #something
class child(parent):
    #something

这里,父类和子类是两个类,子类依赖于父类,子类有父类的属性和它自己的独特属性。所以,这里使用继承。

0
0 Comments

我将以C++作为示范语言,因为它在继承和类方面非常依赖。
这里是一个简单的指南,介绍如何为简单的操作系统(例如windows)构建控件。
控件包括在您的窗口上的简单对象,例如按钮、滑块、文本框等。


构建基本类。

这部分指南适用于(几乎)任何类。
记住,计划得好就是做了一半。
我们正在处理哪种类别?
它的特性是什么,需要哪些方法?
这些是我们需要考虑的主要问题。

我们在这里正在处理操作系统控件,因此让我们从一个简单的类开始,它应该是Button。现在,我们的按钮有哪些属性呢?显然,它需要一个窗口上的位置。此外,我们不想让每个按钮都有一样的大小,因此大小是另一个属性。还需要一个标签(在按钮上绘制的文本)。对每个类别进行这样的设计,然后编写它。现在我知道我需要哪些属性,那么让我们建立这个类。

class Button
{
    private:
        Point m_position;
        Size m_size;
        std::string m_label;
}

请注意,为了代码更短,我省略了所有的getter和setter和其他方法,但你可能也需要包括它们。我也期望我们需要PointSize类,通常我们需要自己定义它们。


接下来是下一个类别。

现在,我们已经完成了一个类别(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;属性。这意味着我们有两个具有共同元素的类,我们重复编写了相同的代码,如果我们只需要编写一次,然后告诉我们的两个类使用那些代码,那不是很棒吗?但是,我们可以实现它。

如果我们有两个具有共同属性的类别(在这种情况下是ButtonSlider),那么创建一个基础类是“总是”(有例外,但初学者不必担心)推荐的。它们都是我们操作系统上的控件,具有大小位置。从此得到一个新类,称为Control

class Control
{
    private:
        Point m_position;
        Size m_size;
}


从共同基类继承相似的类。

现在我们有了Control类,其中包括每个控件的共同项目,我们可以让我们的ButtonSlider继承它。这将节省我们时间、计算机内存和最终的时间。以下是我们的新类:

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成员,该成员指向包含我们的控件所在的窗口(或面板等)。

另外一个问题是,如果我们后来意识到除了SliderButton之外,我们还需要TextBox,我们只需通过class TextBox : public Control {...}创建文本框控件,并且只编写特定于文本框的成员变量,而不是在每个类中反复编写大小、位置和父项。


最终思考。

基本上,每当您有两个具有共同属性或方法的类时,都应创建一个基类。这是基本规则,但您可以使用自己的头脑,因为可能有一些例外情况。

我自己也不是专业程序员,但我正在学习,并且我已经教给您了我所受过的教育者教给我的一切。我希望您(或至少其他人)会发现这个答案有用。即使有些人说Python和其他鸭子类型的语言甚至不需要使用继承,他们也是错的。在大型项目中使用继承将节省您大量时间和金钱,最终您会感谢自己创建基础类。您的项目的可重用性和管理将变得更加容易。

0