考虑到C ++中的以下示例类,您可以看到可以从调用模块访问pic1的所有属性/方法。但只能通过公开声明访问pic2。除了刚刚提到的观点之外,作为面向对象编程的初学者,我只是想知道专业人士首选哪种方法来实现现实生活?
using namespace System::Drawing;
using namespace System::Windows::Forms;
using namespace System;
ref class myClass
{
PictureBox^ pic2;
public:
PictureBox^ pic1;
void setPic2() {pic2 = gcnew PictureBox;}
void addPic2ToControl(System::Windows::Forms::Form^ x) {x->Controls->Add(pic2);}
void setPic2Image(String^ filePath) {pic2->Image = dynamic_cast<Image^>(gcnew Bitmap(filePath));}
//more functions for to access pic2...
};
答案 0 :(得分:1)
什么是封装?
Encapsulation
表示将数据和对该数据进行操作的方法绑定在一个单元中。
如何实施封装?
创建type
structure
或class
通常,类中的数据成员变量保存在private
或protected
访问说明符下,并且通过public
成员函数提供对它们的访问。这可以保护程序员在公开可用时意外修改成员数据的诚实错误。它提供了一种通过显式公开的函数调用来访问和修改成员数据的方法,因此更加慎重且不易出错。
鉴于上述情况,我相信,保持pic2
私有并通过member functions
提供访问权限似乎是合适的方式
答案 1 :(得分:1)
C ++中的封装通常是通过将类中的字段标记为private
或protected
来实现的。但是,你不应该完全依赖于这种方式来保持真正私密的东西 - 如果这实际上是一个安全问题,例如,它根本没有帮助(记住friend
函数。)它更倾向于“分而治之”程序复杂性并保持代码清洁。这是计算机编程中一项历史悠久的挑战,封装只是程序员多年来开发的许多有效技术之一。
如何在源代码中使用封装?例如,很多人会坚持认为你的类中不应该有公共变量,只有公共方法,并且应该使用“getter”来模拟公共变量/ setter“函数。我不一定同意这一点,但我认为,你的课程应该将它作为公共信息所做的事情以及它如何(及其内部状态)作为私人信息来对待,这是公平的。无论如何,这只是常识,即使你没有做OOP。在C程序员中,函数中的static
(持久)变量被认为是比具有全局范围的变量更好的实践,如果你可以侥幸逃脱它。
答案 2 :(得分:1)
通过方法限制对成员访问的一个优点是,您现在可以在中心位置(在类本身内)控制变量的管理。如果以后您决定在将其提供给调用者之前对pic2进行一些处理,则可以在访问方法中执行此操作,而无需在多个位置更改
如果性能受到关注,您可以考虑使用内联方法的选项