Perl OOPs中的封装
Perl中的 封装 是将数据封装起来的过程,以保护它不被外部来源接触到代码的那一部分。封装是面向对象编程的一部分,它被用来绑定数据和用来操作这些数据的子程序。
从另一个角度来说,封装是一个保护罩,防止数据被这个保护罩外的代码访问。
- 从技术上讲,在封装中,一个类的变量或数据被隐藏起来,不受任何其他类的影响,只能通过它们所声明的自己类的任何成员函数来访问。
- 正如在封装中,一个类中的数据被隐藏起来,不被其他类发现,所以它也被称为 数据隐藏。
- 封装可以通过以下方式实现: 将类中的所有变量声明为局部变量,并通过导入包获取类的方法来设置和获取变量的值。
考虑一个现实生活中的封装例子,在一个公司中,有不同的部门,如账务部门、财务部门、销售部门等。财务部门处理所有的财务交易,并保存所有与财务有关的数据记录。同样地,销售部门处理所有与销售有关的活动,并保存所有销售记录。现在可能会出现这样的情况:由于某种原因,财务部门的官员需要某月的所有销售数据。在这种情况下,他不被允许直接访问销售部门的数据。他首先要联系销售部门的其他官员,然后要求他提供特定的数据。这就是封装的作用。在这里,销售部门的数据和可以操作这些数据的员工被包裹在一个名称 “销售部门 “之下。
例子
# Declaration and definition of Base class
use strict;
use warnings;
package Student;
sub new
{
# shift will take package name 'Student'
# and assign it to variable 'class'
my class = shift;
myself = {
'name'=> shift,
'age'=> shift,
'roll_no' => shift
};
# Bless function to bind object to class
bless self,class;
# returning object from constructor
return self;
}
# Method for displaying the details
sub get_details
{
myself = shift;
print "Name is: self->{'name'}\n";
print "Age is:self->{'age'}\n";
print "Roll_no is: self->{'roll_no'}";
}
# Object creation and calling
myobj1 = Student->new("Rahul", 25, 12);
$obj1->get_details();
输出。
Name is: Rahul
Age is: 25
Roll_no is: 12
在上面的代码中,如果需要访问该类的数据进行任何修改或只是打印该类的数据,那么就不能直接进行。需要创建一个该类的对象,然后使用get_details()方法访问数据。这个过程被称为 “数据封装”
封装的优点
- 数据隐藏: 用户对类的内部实现一无所知。用户不会看到类是如何在变量中存储数值的。他只知道我们把值传递给访问器,变量被初始化为该值。
- 增加灵活性: 我们可以根据我们的要求将类的变量设置为只读或只写。如果我们想让变量成为只读,那么我们必须在代码中只使用Get Accessor。如果我们想让变量成为只写的,那么我们只能使用Set Accessor。
- 可重用性: 封装也提高了可重用性,并易于根据新的要求进行修改。
- 测试代码很容易: 封装的代码很容易进行单元测试。