2015-03-02 58 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