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

Ska*_*One 9 c++ python inheritance class class-hierarchy

我知道如何编写和使用简单的类,我甚至知道继承如何工作以及如何使用它.但是,关于如何实际设计类层次结构,甚至如何设计简单类的指南数量非常有限?另外,我何时以及为什么要继承(或使用)一个类?

所以我不是在问我怎么样,我在问何时以及为什么.示例代码总是一种很好的学习方式,所以我很感激它们.此外,强调设计的进展,而不是简单地给出一个句子的时间和原因.

我主要使用C++,C#和Python编程,但我可能会理解大多数语言中的简单示例.

如果任何条款似乎混淆了,请随时编辑我的问题.我不是本地人,我不确定所有的话.

小智 10

我将使用C++作为示例语言,因为它非常依赖于继承和类.这是一个关于如何为简单操作系统(如windows)构建控件的简单指南.控件包括窗口上的简单对象,如按钮,滑块,文本框等.


建立基础课程.

本指南的这一部分适用于(几乎)任何课程.记住,精心策划的一半已完成.我们在做什么课?它的属性和需要的方法是什么?这些是我们需要考虑的主要问题.

我们在这里处理操作系统控件,所以让我们从一个简单的类开始吧Button.现在,我们按钮上的属性是什么?显然它需要一个position窗口.此外,我们不希望每个按钮的大小完全相同,因此size是另一个属性.按钮也"需要"a label(按钮上绘制的文字).这是你对每个类做的,你设计它然后编码它.现在我知道我需要哪些属性,所以让我们构建类.

class Button
{
    private:
        Point m_position;
        Size m_size;
        std::string m_label;
}
Run Code Online (Sandbox Code Playgroud)

请注意我为了更短的代码而省略了所有getter和setter以及其他方法,但是你也必须包含它们.我也期待我们拥有PointSize上课,通常我们必须自己构建它们.


进入下一堂课.

现在我们完成了一个class(Button),我们可以移动到下一个类.让我们一起去Slider,这个栏可以帮助你上下滚动网页.

让我们像按钮一样开始,滑块类需要什么?它position在窗口和size滑块上有位置().此外,它具有最小值和最大值(最小值表示滚动条设置在滑块顶部,最大值表示它位于底部).我们还需要当前值,即卷轴在此刻的位置.这已经足够了,我们可以建立我们的类:

class Slider
{
    private:
        Point m_position;
        Size m_size;
        int m_minValue;
        int m_maxValue;
        int m_currentValue;
}
Run Code Online (Sandbox Code Playgroud)

创建基类.

现在,我们有两个班,我们注意到的第一件事情就是我们刚才定义Point m_position;Size m_size;在这两个类属性.这意味着我们有两个具有公共元素的类,我们只编写了两次相同的代码,如果我们只编写一次代码并告诉我们的两个类使用该代码而不是重写,那会不会很棒?好吧,我们可以.

如果我们有两个具有共同属性的类似类,在这种情况下Button,创建基类是"总是"(有异常,但初学者不应该担心它们)Slider.他们是我们与OS两个控件sizeposition.从这里我们得到一个新的类,称为Control:

class Control
{
    private:
        Point m_position;
        Size m_size;
}
Run Code Online (Sandbox Code Playgroud)

从公共基类继承类似的类.

现在我们得到了我们的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;
}
Run Code Online (Sandbox Code Playgroud)

现在有些人可能会说写Point m_position; Size m_size;两次比写两次: public Control并创建Control课更容易.在某些情况下可能会这样,但仍建议不要两次编写相同的代码,尤其是在创建类时.

此外,谁知道我们最终会找到多少共同属性.稍后我们可能会意识到我们需要Control* m_parent成员到Control该类,该成员指向我们控制所在的窗口(或面板或类似物).

另一件事是,如果我们后来意识到,在顶部SliderButton我们也需要TextBox,我们就可以说创建一个文本框控件class TextBox : public Control { ... }和只写文本框中特定成员变量,而不是大小,位置和父母一次又一次的每个类.


最后的想法.

基本上,当您有两个具有公共属性或方法的类时,您应该创建一个基类.这是基本规则,但您可以使用自己的大脑,因为可能有一些例外.

我自己也不是一个专业的程序员,但我正在学习,我已经教过你一切,因为我的教育工作者已经教给我了.我希望你(或至少某人)会发现这个答案很有用.即使有人说python和其他鸭子打字语言甚至不需要使用继承,但它们是错误的.使用继承将为您在大型项目上节省大量时间和金钱,最终您会感谢您创建基类.项目的可重用性和管理将变得十分容易.