2013-03-02 117 views
22

今天我接受了一次採訪。我有一個OOP的問題,關於封裝&抽象之間的區別?封裝與抽象的區別

我回復了她,據我所知,封裝基本上是將數據成員函數綁定到一個名爲Class的單​​元中。而抽象基本上隱藏了實現的複雜性,提供了訪問用戶的簡易性。我認爲她的答案會很好。但她質疑,如果兩者的目的都是爲了隱藏信息,那麼這兩者之間的實際區別是什麼?我無法給她任何答案。

在問這個問題之前,我讀了關於這兩個OOP概念之間差異的StackOverFlow上的其他線程。但我沒有找到自己的位置來說服面試官。

任何人都可以請一個最簡單的例子證明它?

+4

最後一個公共的方法來訪問這些領域,這樣 奉獻一流水平的封裝,是不是每個類得到這份工作? :) – 2013-03-02 15:57:39

+0

@Adrian - nope;) – WpfBee 2013-03-02 17:17:55

+0

@WPFbee不幸! – 2017-04-10 15:13:26

回答

12

包封物隱藏變量或者可以在一個類所以經常更改爲防止外人直接訪問它的一些執行情況。他們必須通過getter和setter方法訪問它。

抽象用於藏着什麼東西太多,但在程度較高(類,接口)。客戶使用抽象類(或接口)不關心誰或它是什麼,他們只需要知道它可以做什麼。

+2

完美。在我看來,你的答案只是針對我的面試官問題。我試圖用一個實際的例子重新回答你的回答。請讓我知道,如果它證明你的答覆。讓我們以電視爲例。封裝是將內部電路,LED等結合在一起製成電視機。抽象是開關,聲音,頻道設置和其他操作按鈕。 – WpfBee 2013-03-02 17:54:25

+0

夥計抽象與隱藏實現無關......抽象是一種多態互動類的方法 – Mortalus 2013-03-02 18:22:54

+0

@Mortalus - 我不同意你的第一條語句「抽象與隱藏實現無關」。我認爲,當我們開始學習抽象概念時,我們被教導的第一件事就是我們隱藏實現的複雜性併爲用戶提供一些接口來使用它。因爲用戶可能對實現的複雜性沒有興趣。你可以舉一個電視或AC的實際例子。另一件事是,如果它不隱藏實現,那麼爲什麼我們提供了一個抽象類中沒有body的方法。我們顯然隱藏了這裏的實施。 – WpfBee 2013-03-02 18:36:20

6

抽象: 通常完成以提供對一組類的多態訪問。 抽象類不能被實例化,因此另一個類將不得不從它派生來創建更具體的表示。

抽象類的常見用法示例可以是模板方法設計模式的實現,其中引入了抽象注入點,以便具體類可以以自己的「具體」方式實現它。

見:http://en.wikipedia.org/wiki/Abstraction_(computer_science)

封裝: 它躲在從將要使用它的客戶特定類的實現複雜的過程,請記住,「客戶」可以爲程序或事件編寫課程的人。

看到:http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)

+1

抽象與抽象類有關? – 2014-02-06 15:07:17

-1

對我來說,封裝是將冗長/複雜的過程分解成更小和更有組織的子例程的過程。

function DoEverything() { 
    // do everything 
} 
function Encapsulation() { 
    GetTheLegos(); 
    BuildTheLegoShip(); 
    PretendYouAreAPirate(); 
} 

抽象是找出一組進程的相似性並將這些相似性合併成一個進程的過程。

private void ProcessOne() { 
    try { 
     // code 
    }catch(exception ex) { 
     Utilities.log(ex); 
     Error.Text = "Error!"; 
    } 
} 
private void ProcessTwo() { 
    try { 
     // different code 
    }catch(exception ex) { 
     Utilities.log(ex); 
     Error.Text = "Error!"; 
    } 
} 

然後將其轉化爲如下所示的內容。

private void HandleException(exception ex) { 
    Utilities.log(ex); 
    Error.Text = "Error!"; 
} 
private void ProcessOne() { 
    try { 
     // code 
    }catch(exception ex) { 
     HandleException(ex); 
    } 
} 
private void ProcessTwo() { 
    try { 
     // code 
    }catch(exception ex) { 
     HandleException(ex); 
    } 
} 
+0

有沒有「與我」oop ..封裝是它被定義爲什麼,它是也沒有你描述..你描述了重構代碼.. – Mortalus 2013-03-02 18:29:08

+0

「一種便於將數據與操作數據的方法(或其他功能)捆綁在一起的語言結構」。從你自己的鏈接,幾乎就是我的例子。甚至基於這個鏈接,封裝沒有確切的定義!荒謬。 – 2013-03-04 00:55:41

2

抽象 - 是識別一組對象的共同基本特徵的過程(和結果)。 有人可能會說抽象是泛化的過程:所考慮的所有對象都包含在對象的超集中,所有對象都具有給定的屬性(但在其他方面不同)。

封裝 - 封裝數據和函數將這些數據操作成一個單元的過程,以便從外部世界隱藏內部實現。

這是一個與特定編程語言無關的普遍答案(就像問題一樣)。所以答案是:抽象和封裝沒有共同之處。但是它們的實現可能相互關聯(比如,在Java中:封裝 - 細節隱藏在類中,抽象 - 細節在類或接口中根本不存在)。

2

封裝意味着隱藏。封裝也稱爲數據隱藏。您可以將封裝看作是封裝在內部的膠囊(藥片)。封裝包裝,只是隱藏屬性和方法。封裝用於將代碼和數據隱藏在一個單元中,以保護來自世界各地的數據。類是封裝的最好例子。

抽象是指僅向預期用戶顯示必要的細節。顧名思義,抽象是「任何事物的抽象形式」。我們在編程語言中使用抽象來創建抽象類。抽象類表示類的方法和屬性的抽象視圖。在這兩個

1

區別只是視點
封裝字用於隱藏數據,如果我們的目的是爲了防止客戶端裏面查看我們的邏輯

抽象字用於如果我們的目的隱藏數據看是展示我們的客戶端視側視圖

外觀的手段,讓想

BubbleSort(){ 
//code 
swap(x,y); 
} 

這裏我們使用掉期在bubbl如果我們在這裏用整個代碼替換swap(x,y),在單個實例中他/她無法理解我們的邏輯

16

抽象和封裝是兩個重要的面向對象編程(OOPS)概念。封裝和抽象都是相互關聯的術語。封裝和抽象之間

現實生活的差異

包封物手段隱藏。封裝也稱爲數據隱藏。您可以將封裝看作是封裝在內部的膠囊(藥片)。封裝包裝,只是隱藏屬性和方法。封裝用於將代碼和數據隱藏在一個單元中,以保護來自世界各地的數據。類是封裝的最好例子。

抽象是指僅向預期用戶顯示必要的細節。顧名思義,抽象是「任何事物的抽象形式」。我們在編程語言中使用抽象來創建抽象類。抽象類表示類的方法和屬性的抽象視圖。封裝和抽象

  1. 抽象之間

    實現差異是使用接口和抽象類,而封裝使用private和protected訪問修飾符來實現來實現。

  2. OOPS通過阻止程序員以非預期方式訪問數據,利用封裝來強制執行類型的完整性(即確保數據以適當的方式使用)。通過封裝,只有預定的一組功能可以訪問數據。與訪問限制(公共/私人等)捆綁在一起的數據類型和操作(方法)的總稱是一類。

  3. 封裝的實施例

    Class Encapsulation 
    { 
        private int marks; 
    
        public int Marks 
        { 
         get { return marks; } 
         set { marks = value;} 
        } 
    } 
    
  4. 抽象

    abstract class Abstraction 
    { 
        public abstract void doAbstraction(); 
    } 
    
    public class AbstractionImpl: Abstraction 
    { 
        public void doAbstraction() 
        { 
         //Implement it 
        } 
    } 
    
+0

愛你如何將這些條款與他們如何實際執行:) – committedandroider 2014-12-07 01:54:09

+3

從這裏複製http://stackoverflow.com/a/20687967/5955233 – 2017-03-10 12:49:19

0

的實施例的抽象和封裝是兩個重要的面向對象編程(OOPS)的概念。封裝和抽象都是相互關聯的術語。 封裝與抽象之間的真實生活差異: 封裝意味着隱藏。封裝也稱爲數據隱藏。您可以將封裝看作是封裝在內部的膠囊(藥片)。封裝包裝,只是隱藏屬性和方法。封裝用於將代碼和數據隱藏在一個單元中,以保護來自世界各地的數據。類是封裝的最好例子。

抽象是指僅向預期用戶顯示必要的細節。顧名思義,抽象是「任何事物的抽象形式」。我們在編程語言中使用抽象來創建抽象類。抽象類表示類的方法和屬性的抽象視圖。封裝和抽象

  1. 抽象之間

    實現差異是使用接口和抽象類,而封裝使用private和protected訪問修飾符來實現來實現。

  2. OOPS通過阻止程序員以非預期方式訪問數據,利用封裝來強制執行類型的完整性(即確保數據以適當的方式使用)。通過封裝,只有預定的一組功能可以訪問數據。與訪問限制(公共/私人等)捆綁在一起的數據類型和操作(方法)的總稱是一類。 enter image description here

1

抽象:什麼是最低限度的功能,和可變應該暴露在我們班出方。 封裝:如何實現這個要求,意味着如何實現。

0

抽象通過爲您提供更抽象的圖片(一種10,000英尺的視圖)來隱藏複雜性,而封裝隱藏了內部工作,以便您稍後可以更改它。換句話說,抽象隱藏了設計級別的細節,而封裝隱藏了實現級別的細節。

例如,當你第一次描述一個物體時,你會用更抽象的術語來說話,例如,一輛可以移動的車輛,你不會告訴車輛如何移動,它是否會通過使用輪胎移動,或者它會飛,還是會出售。它只是移動。這被稱爲抽象。我們正在談論一個最重要的事情,它正在移動,而不是專注於諸如在平面,天空或水中移動的細節。

封裝是關於實施。其唯一目的是隱藏來自外部世界的物體的內部工作,以便以後可以更改它,而不會影響外部客戶。

例如,我們有一個HashMap,它允許您使用put()方法存儲對象,並使用get()方法檢索對象。 HashMap如何實現此方法(請參見此處)是HashMap的內部細節,客戶端只關心將對象存儲並返回的對象,它們不關心HashMap是否正在使用數組,它是如何解決衝突,是否它使用鏈表或二叉樹存儲在同一個桶物體落地等

1

存在對藏匿在深度抽象,封裝和信息之間的差異倒是一個偉大的文章:http://www.tonymarston.co.uk/php-mysql/abstraction.txt

下面是從結論文章:

抽象,信息隱藏和封裝是非常不同, 但高度相關的概念。有人可能會說,抽象是一種技術,它可以幫助我們識別哪些具體信息應該是可見的,哪些信息應該隱藏。封裝是 用於封裝信息的技術,以隱藏應隱藏的內容,並使可見的內容可見。

0

抽象

在Java中,抽象是指隱藏的信息,真實的世界。它建立了黨之間的合同,告訴「我們該如何使用這項服務」。

例如,在API開發中,只有服務的抽象信息已經向世界揭示,而不是實際的實現。 java中的接口可以很好地實現這個概念。

接口提供各方,例如生產者和消費者之間的合同。生產者生產貨物時不讓消費者知道產品的製造方式。但是,通過界面,製作人讓所有的消費者知道什麼產品可以購買。在抽象的幫助下,生產者可以將產品推銷給消費者。

封裝:

封裝是抽象的一個層次。相同的產品公司嘗試屏蔽來自其他生產組的信息。例如,如果一家公司生產葡萄酒和巧克力,封裝有助於屏蔽每個產品相互制造的信息。

  1. 如果我有單獨的一個用於葡萄酒,另一個用於巧克力,並且如果所有類都在包中聲明爲默認訪問修飾符,我們將爲所有類提供封裝級封裝。
  2. 在一個包,如果我們聲明申請(成員場)作爲 私人和具有這些領域