我正在准备面试,并决定刷新我的OOP概念.有数百篇文章可供使用,但似乎每篇文章都有不同的描述. 有人说
抽象是"识别具有系统变化的共同模式的过程;抽象代表了常见模式,并提供了指定使用哪种变体的方法"(Richard Gabriel).
并通过抽象类实现.
一些其他的说
抽象意味着仅向对象的客户端显示必要的细节
和
假设您的Employee类中有一个方法"CalculateSalary",它将EmployeeId作为参数,并将当前月份的员工薪水作为整数值返回.现在,如果有人想要使用该方法.他不需要关心Employee对象如何计算薪水?他唯一需要关注的是方法的名称,输入参数和结果成员的格式,
我一遍又一遍地搜索,结果似乎没有给我一个正确的答案. 现在,封装在哪里适合所有这些? 我搜索并发现了堆栈溢出问题.即使答案到问题被混淆 在这里,它说
封装是一种用作抽象的一部分的策略.封装是指对象的状态 - 对象封装其状态并将其隐藏在外部; 类的外部用户通过其方法与之交互,但无法直接访问类状态.因此,该类抽象出与其状态相关的实现细节.
而这里的另一个知名的成员说,
它们是不同的概念.
抽象是精炼对象的所有不需要/不重要的属性并且仅保留最适合您的域的特征的过程.
现在我搞砸了整个概念.我知道抽象类,继承,访问说明符和所有.我只是想知道在面试中被问及抽象和/或封装时我该如何回答.
请不要将其标记为重复.我知道有几个类似的问题.但我想避免相互矛盾的解释之间的混淆.任何人都可以提出可靠的链接吗?除非再次造成混淆,否则也欢迎链接到stackoverflow问题.:)
编辑:我需要答案,有点c#导向
我今天接受了采访.我有一个来自OOP的问题,关于Encapsulation&Abstraction之间的区别?
我回答她的知识,Encapsulation基本上是将数据成员和成员函数绑定到一个名为Class的单元中.而抽象基本上是为了隐藏实现的复杂性并提供对用户的轻松访问.我觉得她的回答会很好.但她问道,如果两者的目的都是隐藏信息,那么这两者之间的实际区别是什么?我不能给她任何答案.
在提出这个问题之前,我在StackOverFlow上阅读了关于这两个OOP概念之间差异的其他线程.但我并没有发现自己有能力说服采访者.
任何人都可以用最简单的例子来证明它的合理性吗?
假设我在PHP中有一个非常简单的CRUD系统来管理数据库。说它拥有一个产品清单。使用Doctrine ORM,我想查询数据库并查看/编辑/添加记录。根据入门手册,
创建实体类时,所有字段都应受保护或为私有字段(非公共字段),每个字段都应具有getter和setter方法($ id除外)。mutator的使用使Doctrine可以挂接到以实体#field = foo直接设置值的方式无法操纵实体的调用。
这是提供的示例:
// src/Product.php
class Product
{
/**
* @var int
*/
protected $id;
/**
* @var string
*/
protected $name;
public function getId()
{
return $this->id;
}
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
}
// Recording a new title
$product->setName("My new name");
$db->persist($product);
$db->flush();
// Echoing the title
echo $product->getName();
Run Code Online (Sandbox Code Playgroud)
但是,这似乎过于复杂。假设我没有必要像实体手册中所述去处理实体的调用。我可以使这段代码更短并执行以下操作:
// src/Product.php
class Product …Run Code Online (Sandbox Code Playgroud)