我正在阅读OOP的一些基本内容。我对封装和抽象感到困惑。 据我了解, 抽象是一种只暴露少数事物并隐藏少数事物的方式。 封装帮助我们封装对象的状态,以便外部世界无法访问它,并且可以通过内部方法访问它。 因此它们都是相关的。 但我已多次读过使用getter和setter实现封装,而使用抽象类和接口实现抽象。 现在考虑以下代码(C#)
class A
{
private int a;
public void print()
{
Console.WriteLine("Value of a = {0}", a);
}
}
class B
{
static void Main(string[] args)
{
A a = new A();
a.print();
}
}
在上面的代码中,我没有使用接口或抽象类,但仍然按照我的理解,我已经通过不让B类直接访问变量来实现抽象。通过实现封装,我确保只能使用A的内部方法访问它。 那么请你帮我清除一下这个混乱?
答案 0 :(得分:3)
您在示例中实现了抽象。
“抽象”是一个过期的术语,它的确切含义也取决于语境,这就是为什么有时它会让我们感到困惑。根据定义“抽象仅捕获与当前视角相关的对象的细节。”
在你的情况下,(用户)B类要求对象“a”(类A的类型)打印一些东西而不详细说明类“A”是如何实现它的。因此,只有方法名称与用户相关,而不是详细信息。
我对Abstration也有很多怀疑,但this wikipedia page on Abstraction给了我很多帮助。
抽象用于许多硬件和软件概念,如HAL,Datbase,multiple languages等。
作为OOPS四大支柱之一,它是“定义代表抽象”演员的对象的工具“(意味着类),可以执行工作(作为方法),报告和更改其状态(事件),以及”与系统中的其他对象进行通信。
另一方面,封装是(如维基百科上所示):
术语封装是指隐藏状态细节,但扩展数据类型的概念,并标准化不同数据类型交互的方式(是抽象的开始)。
但是如果你更深入地理解“Abstration”并将其概括(再次来自维基百科页面):
当抽象进入定义的操作时,启用不同类型的对象,它被称为多态。当它在相反的方向上进行时,在类型或类中,构造它们以简化一组复杂的关系,它被称为委托或继承。
答案 1 :(得分:2)
封装意味着隐藏复杂性,抽象意味着暴露基本的东西。
示例:
汽车与发动机,化油器和其他东西一起工作,这使它可以移动(这称为封装)但用户只知道需要知道驾驶汽车的车辆,车轮,制动器,车门和加速器(这称为抽象)