2015-03-02 59 views
-2

在阅读不同来源的封装和抽象的定义时,我越来越困惑。真正难以确定哪个是正确的定义。OOP抽象vs封装多个定义

封装定义1

封装:封装是在 使场的技术领域经由公共方法

封装定义2

类私有和提供

封装是将数据和功能 掩盖起来的过程le单位(称为班级)。

抽象定义1

抽象造型是用最少的 信息的现实世界对象的一种方式。

抽象定义2

只露出所必需的方法。

请帮助我理解这些词的正确定义与OOP有关的意思。解释正确定义的书的来源也是优选的。

+4

没有一个正确的定义。你给出的每个版本都讲述了*封装/抽象,但是并没有权威地定义*它。 – 2015-03-02 18:28:13

+0

[在java中如何封装与抽象不同作为面向对象的概念?](http://stackoverflow.com/questions/8960918/how-encapsulation-is-different-from-abstraction-as-a-object面向概念的) – Tachyon 2015-03-02 18:30:06

+1

由于这些都是概念,所以没有全球接受的具体定义。例如,大多数人会在上面的问题中查看封装的两个定义等同于...学习使用Google和维基百科...他们是你的朋友。 – RudolphEst 2015-03-02 18:32:00

回答

1

谈论代码,抽象只是一段描述真实世界“事物”的代码。大多数时候你无法描述整个“事物”,但是你可以描述它的主要特征,在你的代码中,它将被称为属性

抽象的一个例子是餐厅:你去,你要求的菜单,并选择你想吃什么......但你不吃纸:你选择你想要看什么它的抽象(菜单)......抽象可能只是说“鸡蛋&培根”,但是当服务员拿到你的订单时,它有一对鸡蛋(炒蛋),两片脆皮培根和其他东西。菜单只是真实的简单抽象事物。

采取Bicycle example in the Java Tutorials:这辆自行车属性:

  1. 速度
  2. 齿轮
  3. Cadence公司

你在的任何其他特性不感兴趣(在这个例子中)自行车......所以这是一个抽象。

现在,关于封装:在编写代码时,你希望你的对象的属性只在“propper”的方式修改:如果你改变的速度(同样的自行车例子),你可能也必须改变节奏和/或换档。所以,你声明的属性private只有通过public方法进行更新,并且,在这些方法中,可以确保所有的属性具有连贯值:

public class Bicycle { 
    private int speed, gear, cadence; 
    /** 
    * Default constructor 
    */ 
    public Bicycle() { 
     speed = 0; 
     gear = 1; 
     cadence = 0; 
    } 
    /** 
    * An example 
    */ 
    public void setSpeed(int speed) { 
     this.speed = speed; 
     /* 
      You can set the value of the other attributes here if you want to 
     */ 
    } 
    /** 
    * Another example 
    */ 
    public void gearUp() { 
     if(gear < 5) 
      gear++; 
     /* 
      Here you are preventing other methods to set the gear to 
      a value higher than 5. 
     */ 
    } 
    /** 
    * Another one 
    */ 
    public void gearDown() { 
     if(gear > 1) 
      gear--; 
     /* 
      Here you are preventing other methods to set the gear to 
      a value lower than 1. 
     */ 

    } 
} 
0

就拿下面的两段代码:

// Snippet #1 
public static void Main(){ 
    int sum = 0; 
    for (int i = 0; i <= 1000; i++) { 
     sum += i; 
    } 
    System.out.println(sum); 
} 

在上面的代码片段,你的程序计算从0所有整数多达1000你可以看到计算是如何做的总和,你有超过存储和的值的变量控制。

// Snippet #2 

public class Adder { 
    private int sum; 

    public Counter(){ 
     this.sum = 0; 
    } 

    public void add(int value){ 
     this.sum += value; 
    } 

    public int getSum(){ 
     this.sum; 
    } 
} 

public static void Main(){ 
    Adder adder = new Adder(); 
    for (int i = 0; int <= 1000; i++) { 
     adder.add(i); 
    } 
    System.out.println(adder.getSum()); 
} 

上面的代码片段执行相同的任务,但不同。有一堂课提供了你所质疑的两个特点。它提供是一个抽象系统添加数字,也封装的的计算是如何做的详细信息。换句话说,它将添加数字的问题以及它从迭代0到1000的数字(在Main函数中)的工作方式分开。

在这个例子中:

  • 的抽象是将数字的概念,所以你将有一个不同的抽象针对每个不同类型的想法

  • encaptulation是实施细节与主要计划的分离。也就是说,你可以创建同一类型的抽象类新的,但使用不同的实现(一而不是联合国INT,例如)。

1

抽象
抽象没有与制作方式的私人或公共的事情。它与识别哪种类型的功能对于某种类型是常见的有关。

在java中的抽象类需要一个步骤进一步比的接口。在接口中,类型X的类必须做X,Y,Z。无论如何,X,Y,Z都可以实现。

一个抽象类说,X型的类必须做X,Y,Z,但一个方法标记为抽象必须做一个特定的方式,也就是它在抽象类(抽象)实现的真实。

封装
它只是将一件或多件事包装在另一件事情中。简化或隐藏代码。为什么你想要这样做的一个例子是简化流程。如果你希望用户能够关闭计算机,例如,你可以既可以有一堆方法的人来显式调用:

Util.shutdownApps(); 
Util.shutdownServices(); 
Util.shutdownScreenAndKeyboard(); 
Util.poweroff(); 

如果你想关闭以特定方式或只是让有人更容易关闭你可以封装它:

Util 
    public void shutdown(){ 
    Util.shutdownApps(); 
    Util.shutdownServices(); 
    Util.shutdownScreenAndKeyboard(); 
    Util.poweroff(); 
    } 

    private shutdownApps(){...} 
    private shutdownServices(){...} 
    private shutdownScreenAndKeyboard(){...} 
    private poweroff(){...} 
+0

关于Barranka的回答,任何一段代码都可以描述真实世界的事物。有一个抽象类没有意义,如果你只有一个*类型。有人肯定会说哦,但有一个接口会更好的可测试性。但是如果你有一个为什么要做额外的代码?当你发现你需要不同类似的类型时,你可以重构。 – Savan 2015-03-02 18:59:43