2009-02-04 45 views
10

Hi All,Phương pháp trả về một giao diện

Tôi đang nghĩ trong dòng mã này

IDataReader myReader = questDatabase.ExecuteReader(getQuest); 

Tôi đang sử dụng DAAB nhưng tôi không thể hiểu cách thức và ý nghĩa của những gì thực tế phương thức ExecuteReader (DbCommand) trả về một giao diện IDataReader.

Bất cứ ai có thể giải thích, xin vui lòng

+0

tôi đang học giao tiếp và có câu hỏi chính xác như vậy. Câu trả lời của Pablito chính xác là những gì tôi đang tìm kiếm và xác nhận rằng tôi đang xây dựng triển khai của mình một cách chính xác. Cảm ơn các bạn!! –

Trả lời

15

Nó cho phép bạn DataReader mà không cần biết loại DataReader nào bạn đang sử dụng (tức là SqlDataReader, OleDbDataReader, EtcDataReader), vì vậy nếu một ngày nào đó bạn muốn thay đổi trình quản lý dữ liệu bạn đang sử dụng sẽ không ảnh hưởng đến logic của bạn, nói cách khác nó cho bạn trừu tượng. Ví dụ:

bạn có thể sử dụng

IDbCommand command = GiveMeSomeCommand(); 
IDataReader r = command.ExecuteReader(); 

mà không biết trong đó cung cấp bạn đang sử dụng

nó có thể là:

private static IDbCommand GiveMeSomeCommand() 
{ 
    return new OleDbCommand(); 
} 

hoặc nó có thể được

private static IDbCommand GiveMeSomeCommand() 
{ 
    return new SqlCommand(); 
} 

hoặc bất kỳ thứ gì.

EDIT:

Bạn cũng có thể sử dụng DBFactories.

DbProviderFactory factory = GiveMeSomeFactory(); 
IDbCommand command = factory.CreateCommand(); 
IDataReader r = command.ExecuteReader(); 

//and create more objects 
IDataAdapter adapter = factory.CreateDataAdapter(); 
IDbConnection conn = factory.CreateConnection(); 

và sau đó tạo ra cung cấp dịch vụ của bạn trong lớp khác

private DbProviderFactory GiveMeSomeFactory() 
{ 
    if(something) 
     return SqlClientFactory.Instance; 
    else if(somethingElse) 
     return OracleFactory.Instance; 
    else if(notThisAndNotThat) 
     return MySqlFactory.Instance; 
    else 
     return WhateverFactory.Instance; 

} 
+2

Tôi thực sự cảm ơn tất cả các bạn, tôi rất ngạc nhiên về sự cống hiến của bạn, Thật vui khi được ở trong một cộng đồng như thế này: Cảm ơn tất cả – netseng

4

Nó trả về một giao diện vì việc thực hiện của giao diện là không quan trọng, chỉ là API rằng giao diện cung cấp.

+0

Tôi thực sự cảm ơn tất cả, tôi rất ngạc nhiên về sự cống hiến của bạn, Thật vui khi được ở trong một cộng đồng như thế này. Cảm ơn tất cả – netseng

3

"Trả về một giao diện" thực sự có nghĩa là: "Trả lại một thể hiện của một số lớp mà thực hiện giao diện mà"

Trong trường hợp này, nó sẽ trả về một đối tượng rất giống với một đối tượng SqlDataReader, cho phép bạn thực hiện các phương pháp như .Read() và triển khai các giao diện IDisposable và IDataRecord.

+0

Tôi thực sự cảm ơn tất cả, tôi rất ngạc nhiên về sự cống hiến của bạn, Thật vui khi được ở trong một cộng đồng như thế này. Cảm ơn tất cả – netseng

+0

là một khái niệm tương tự về đa hình (tức là một con trỏ đối tượng có thể trỏ đến bất kỳ loại tham chiếu nào được thừa kế từ Object? – iliketocode

2

Nó không trả về Giao diện cho mỗi lần truy cập, mà là một đối tượng hỗ trợ giao diện đó.

+0

Tôi thực sự cảm ơn tất cả, tôi rất ngạc nhiên về sự cống hiến của bạn, Thật vui khi được ở trong một cộng đồng như thế này. Cảm ơn tất cả – netseng

6

Phương thức sẽ trả về một đối tượng, là một thể hiện của một lớp và loại lớp đó sẽ hỗ trợ IDataReader.

Vấn đề là, loại đối tượng không quan trọng, chỉ thực tế là lớp thực hiện giao diện.

Nếu bạn đang lái xe ô tô, bạn không cần biết đó có phải là một ford hay một toyota hay không, bạn lái xe theo cùng một cách.

Lái xe "giao diện" giống nhau, khi xe hỗ trợ giao diện, bạn có thể lái nó.

Ditto với IDataReader, sau khi lớp trả về hỗ trợ giao diện, bạn có thể sử dụng nó.

+0

Cảm ơn tất cả, Thật tuyệt khi được ở một Comunity như – netseng

2

Nó trả về một đối tượng triển khai giao diện cụ thể này và đó là tất cả những gì bạn thực sự quan tâm. Đối tượng "là một" IDataReader và có thể thực hiện tất cả các phương thức mà IDataReader có.

+0

này tôi thực sự cảm ơn tất cả, tôi ngạc nhiên trong sự cống hiến của bạn, Đó là grat được trong một vc như thế này. Cảm ơn tất cả – netseng

+0

Đó là những gì tôi thích về StackOverflow: p – random

Các vấn đề liên quan