我一直试图通过许多链接和youtube视频来理解封装和抽象的概念,但仍然有一些与封装概念相关的混淆。
根据我对抽象和封装概念的理解是:
抽象仅显示必要的内容
封装说隐藏复杂性
例如:
如果我们有客户申请通过获取数据库连接来添加客户及其相关详细信息(如地址)。
在这个场景中,我对抽象的理解只显示了我们类中的addCustomer()方法,以及当调用add方法时我们执行的其余操作,如getDBConnection()和addCustomerAddress()隐藏在其中。
**
public void addCustomerDetails(){
getDBConnection();
addCustomer();
addCustomerAddress();
}
**
所以在这里使用我们类的人只需要调用addCustomerDetails()(ieAbstraction),而不必担心如何建立数据库连接以及如何执行这些操作 ie(隐藏详细信息或封装)
到目前为止,一切都很好,但我在某处读到了与封装相关的另一个定义,如:
数据封装是将数据和函数组合成一个称为类的单元的过程。
可以通过将数据成员保持为私有和公共功能来实现,这样任何人都无法直接访问它。
请告诉我封装的正确定义是什么?如何?
感谢。
答案 0 :(得分:0)
封装的想法最初可以被认为是保护你的班级领域。
我通常认为Encapsulation是你不提供对类外实体(即外部类)的公共访问,如果你愿意,你可以使用公共方法(通常是getter和setter)来实现。
让我们举一个例子:
private String field1;
此字段只能从此类中的方法访问,而不能访问其他内容;对外部类都没有读或写访问权。
如果您希望提供读取权限,请为该字段实现一个getter:
public String GetField1() { return this.field1 }
现在,这是封装的好习惯,如果您现在想要提供写访问权限,您将执行以下操作:
public void SetField1(string value)
{
if(some_logic_here}
{
// If and only if true, then set
this.field1 = value
}
}
因此,您的类'属性不会获得随机值,但会通过一些检查,以确保数据有效且适合该字段所代表的内容。
总结一下Encapsulation:
答案 1 :(得分:0)
以这种方式考虑封装,然后它实际上可以将您的第一个封装定义连接到第二个定义。
封装="将数据和功能组合成一个叫做class" (你的第二个定义)
无法从类外部访问类中的每个私有数据成员。所以,它被有效地隐藏了。只有类中的方法/函数才能访问它们。从类外部开始,为了操作类中的私有数据成员,只能通过调用在同一个类中定义的公共方法/函数来实现。