gpt4 book ai didi

c++ - 应该如何构建基本的类层次结构?

转载 作者:太空狗 更新时间:2023-10-29 20:14:30 37 4
gpt4 key购买 nike

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center为指导。




8年前关闭。




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

所以我并不是真的在问 怎么样 , 我在问 为什么 .示例代码始终是一种很好的学习方式,因此我将不胜感激。此外,强调设计的进度,而不是简单地给出一个关于何时和为什么的句子。

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

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

最佳答案

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

建立基础类。

本指南的这一部分适用于(几乎)任何类(class)。
请记住,精心策划是成功的一半。
我们在上什么样的类(class)?
它有哪些属性,需要哪些方法?
这些是我们需要思考的主要问题。

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

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

请注意,为了更短的代码,我省略了所有的 getter 和 setter 以及其他方法,但您也必须包括这些。我也期待我们有 PointSize类,通常我们必须自己构造它们。

进入下一个类。

现在我们完成了一节课( Button ),我们可以转到下一节课。
一起去 Slider ,酒吧,例如帮助您上下滚动网页。

让我们像按钮一样开始,我们的滑块类需要什么?
它在窗口上有位置( position )和 size滑块的。此外,它有最小值和最大值(最小值意味着滚动条设置在滑块的顶部,最大值意味着它在底部)。我们还需要当前值,即当前滚动条的位置。现在已经足够了,我们可以构建我们的类:
class Slider
{
private:
Point m_position;
Size m_size;
int m_minValue;
int m_maxValue;
int m_currentValue;
}

创建基类。

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

如果我们有两个具有共同属性的相似类,则建议“始终”创建基类(也有异常(exception),但初学者不必担心),在这种情况下 ButtonSlider .它们都是我们操作系统上的控件 sizeposition .由此我们得到一个新类,名为 Control :
class Control
{
private:
Point m_position;
Size m_size;
}

从公共(public)基类继承相似的类。

现在我们得到了 Control类,其中包括每个控件的常用项,我们可以告诉我们的 ButtonSlider继承它。这将节省我们的时间、计算机内存和最终时间。这是我们的新类(class):
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类(class)。
在某些情况下这可能是正确的,但仍然建议不要两次编写相同的代码,尤其是在创建类时。

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

另一件事是,如果我们后来意识到在 Slider 之上和 Button我们还需要 TextBox ,我们可以通过说 class TextBox : public Control { ... } 创建一个文本框控件并且只写文本框特定的成员变量,而不是在每个类上一次又一次地写入大小、位置和父变量。

最后的想法。

基本上,当您有两个具有共同属性或方法的类时,您应该创建一个基类。
这是基本规则,但您可以使用自己的大脑,因为可能有一些异常(exception)。

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

关于c++ - 应该如何构建基本的类层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16132844/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com