2010-09-30 79 views
-2

可一些身體解釋我的抽象和接口在asp.net,C#通過採取適當方面例子... pleasse 我不理解它長期抽象和接口的解釋

+1

這個問題太廣泛了,爲什麼這個問題特別與asp.net有關? – 2010-09-30 15:14:48

+0

聽起來像你是OOP的新手。看看這裏:http://www.lostechies.com/blogs/chad_myers/archive/2008/03/07/pablo-s-topic-of-the-month-march-solid-principles.aspx – Charles 2010-09-30 15:34:51

回答

3

我經常發現下面的示例相當照明當涉及到解釋這個:

免責聲明:代碼示例直接寫入文本,並可能包含我監督的錯誤。請讓我知道,如果你發現這樣的錯誤。

假設你有一個客戶表的數據庫,並在你的代碼中有一個客戶類:

class Customer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

爲了提供一種機制,從數據庫中獲取客戶數據,您需要寫一些這樣的課。這可以放置在稱爲存儲庫的東西中。現在,我們不希望我們的代碼太依賴於我們使用的確切數據庫。它可能是SQL服務器,它可能是一個文本文件。所以我們想要一個抽象層屏蔽這些知識的代碼。所有我們需要知道的是什麼這樣的庫看起來像是:

public interface ICustomerRepository 
{ 
    Customer GetCustomer(int id); 
    IEnumerable<Customer> FindCustomers(string beginningOfName); 
} 

我們現在可以實現此接口用於數據存儲,我們使用:

public class SqlServerCustomerRepository : ICustomerRepository 
{ 
    public Customer GetCustomer(int id) 
    { 
     using(SqlConnection connection = new SqlConnection(connectionString)) 
     { 
      // code to fetch data and populate Customer objects go here 
     } 
    } 
    // implementations of other members of ICustomerRepository 
    // left out to keep code short. Just imagine they are here :) 
} 

最後,當我們要使用此代碼,我們可以有一個工廠創建的具體實施ICustomerRepository使用:

public static class RepositoryFactory 
{ 
    public static ICustomerRepository CreateCustomerRepository() 
    { 
     return new SqlServerCustomerRepository(); 
    } 
} 

...在我們的代碼,我們需要的數據:

ICustomerRepository repository = RepositoryFactory.CreateCustomerRepository(); 
IEnumerable<Customer> customers = repository.FindCustomers("A"); 

這種方式,有特定類型的使用存儲庫的消耗代碼之間沒有硬耦合,(除了在工廠方法,但這也正是這種知識存在獨一無二的地方) 。這使得替換具體的存儲庫實現變得很容易。這對於測試也很有用,您可以輕鬆創建一個模擬庫,返回給定輸入的硬編碼結果,以便您可以單元測試需要來自庫的數據的代碼。

+0

先生什麼是IEnumerable在這裏,似乎很難理解我請詳細說明這個..我是新手 – NoviceToDotNet 2010-09-30 15:50:44

+0

@NovicetoDotNet:'IEnumerable '是一個接口,實際上是由.NET中的所有列表類型(包括數組)。基本上它所做的就是允許你使用'foreach'循環來遍歷它包含的項目,而且它也是圍繞着LINQ功能構建的類型。 – 2010-09-30 16:27:43

1

那麼抽象類和接口不是嚴格的asp.net技術他們是面向對象的概念。

接口

接口類似於類,但所有的方法和屬性是抽象的。一個接口不能像抽象類那樣實例化。 Interface中定義的所有方法和屬性默認爲public和abstract。

接口通常指的是實體向外部提供自身的抽象。界面可以幫助分離外部和內部通信的方法,而不會影響外部實體與類型的交互方式。 例如: 如果您有interface IDoSomething { void Do(); } 實現此接口的類必須爲Do()方法提供一個主體,例如

class SomeClass : IDoSomething { public void Do() { //body of the method } } 這樣做的好處是當你做一些需要的東西時Do方法你通過接口而不是類。

public static void SomeMethod(IDoSomething obj) { obj.Do(); } 現在SomeMethod(IDoSomething obj)將與實現​​

抽象類

一個抽象類是具有定義爲抽象的至少一個方法的類的任何類工作。這種類不能被實例化。抽象類可以具有一個或多個抽象方法和屬性,以及其他方法和屬性(如普通類)。

的想法是相同的,但在抽象類,你可以有實現的邏輯,字段等方法。

0

抽象

抽象是隱藏的對象是如何工作的,其只顯示對象的,我們可以把它理解方式的信息的過程。意味着它代表了顯示地面細節的基本細節。我們把所有變量和方法放在一個必需的類中。

如:員工和病人。

公司有興趣填補關於僱員的詳細信息,如姓名,地址,資質,出生日期,年齡,手機,商標,經驗等

醫院興趣,以填補有關,如姓名,出生日期,身高,體重病人的詳細信息,年齡,地址,手機,血型等

公司和醫院有興趣填寫一些常見的字段,如姓名,年齡,DOB,地址,手機等。所以我們可以創建一個類,抽象類。這個類不會完整,但可以由其他類繼承。

摘要V5接口 不能創建抽象類的對象,但可以使這種推導。 一個抽象類可以包含抽象方法或非抽象方法。抽象成員在抽象類中沒有任何實現,但是派生類中必須提供相同的實現。

一個抽象類可以具有抽象成員以及非抽象成員。但是在接口中,所有成員都是隱式抽象的,接口的所有成員都必須覆蓋其派生類。

定義與所有的抽象成員一個抽象類是類似於定義的接口。也就是說我們可以說一個接口是一個抽象類,包含所有抽象成員。 類只能從一個基類繼承,所以如果要使用抽象類爲一組類提供多態性,它們必須全部從該類繼承。 抽象類還可以提供已經實施的成員。因此,您可以使用抽象類確保一定數量的相同功能,但不能使用接口。

這裏有一些建議,幫助你決定是否要使用一個接口或抽象類,爲您的組件提供多態性。

1)。如果您期望創建組件的多個版本,請創建一個抽象類。抽象類爲您的組件版本提供了一種簡單而簡單的方法。通過更新基類,所有繼承類都會隨着更改而自動更新。另一方面,接口一旦創建就無法更改。如果需要新版本的界面,則必須創建一個全新的界面。 2)。如果您正在創建的功能在各種不同的對象中都有用,請使用界面。抽象類應主要用於密切相關的對象,而接口最適合爲無關類提供通用功能。 3)。如果您正在設計小而精簡的功能,請使用接口。如果您正在設計大型功能單元,請使用抽象類。 4)。如果您想在組件的所有實現中提供通用的實現功能,請使用抽象類。抽象類允許您部分實現您的類,而接口不包含任何成員的實現。