2012-02-26 43 views
6

thể trùng lặp:
Interfaces: Why can't I seem to grasp them?
Why would I want to use Interfaces?Tại sao tôi cần Giao diện?

Tôi nghĩ rằng câu hỏi này được lặp lại 1000 lần và tôi xin lỗi cho hỏi một lần nữa. Tôi thực sự tìm kiếm một câu trả lời đơn giản đơn giản vì sao tôi cần giao diện một cách rõ ràng, hoặc nếu bạn giải thích điều gì đó tôi không thể đạt được nếu không có Giao diện.

Nếu đó là đa thừa kế thì tôi sẽ yêu cầu bạn cung cấp cho tôi một ví dụ đơn giản mà qua đó tôi có thể hiểu tại sao tôi cần giao diện.

--Thx trước.

Lưu ý: Tôi đang hỏi câu hỏi này trong bối cảnh của .NET (C#) ngôn ngữ

Edit1: Còn bây giờ bất cứ khi nào tôi cố gắng tìm hiểu giao diện tâm trí của tôi nói với tôi -> "Buddy bạn sẽ phác thảo cơ thể của một ai đó trong một tờ giấy trắng "Nhưng bạn cần một tờ giấy trắng khác, nơi bạn phải vẽ lại đường viền, vẽ tất cả các phần của cơ thể tô màu cho chúng để có được bức tranh thực". đường viền

+0

Điều này có thể giúp: giao diện mô tả * thuộc tính ngoại vi *, lớp trừu tượng xác định các hàm * lõi *. – Jason

+0

nếu bạn muốn dự án của bạn nên hỗ trợ cơ sở dữ liệu khác nhau. để khách hàng có thể thay đổi cơ sở dữ liệu của mình trong tương lai, chúng tôi sử dụng giao diện chứa các thủ tục thuộc tính trong tệp lớp với các đối tượng thay đổi ........ –

+0

Có rất nhiều bản sao tiềm năng của câu hỏi này ... dưới đây là một số ít: [1 ] (http://stackoverflow.com/questions/240152/why-would-i-want-to-use-interfaces), [2] (http://stackoverflow.com/questions/3355408/explaining-interfaces-to -students), [3] (http://stackoverflow.com/questions/122883/interfaces-why-cant-i-seem-to-grasp-them) –

Trả lời

12

Cách dễ nhất để hiểu giao diện là chúng cho phép các đối tượng khác nhau hiển thị chức năng COMMON. Điều này cho phép lập trình viên viết nhiều mã đơn giản hơn, ngắn hơn mà các chương trình vào một giao diện, sau đó miễn là các đối tượng thực hiện giao diện đó nó sẽ hoạt động.

Cơ sở dữ liệu cung cấp:

Có rất nhiều nhà cung cấp cơ sở dữ liệu khác nhau, MySQL, MSSQL, Oracle, vv Tuy nhiên tất cả các đối tượng cơ sở dữ liệu có thể làm những điều tương tự, do đó bạn sẽ tìm thấy nhiều giao diện cho các đối tượng cơ sở dữ liệu. Nếu một đối tượng thực hiện IDBConnection thì nó sẽ hiển thị các phương thức Open() và Close(). Vì vậy, nếu tôi muốn chương trình của tôi là nhà cung cấp cơ sở dữ liệu bất khả tri, tôi lập trình cho giao diện chứ không phải cho các nhà cung cấp cụ thể.

IDbConnection connection = GetDatabaseConnectionFromConfig() 
connection.Open() 
// do stuff 
connection.Close() 

Xem bằng cách lập trình để một giao diện (IDbConnection) bây giờ tôi có thể trao đổi trên bất kỳ nhà cung cấp dữ liệu trong cấu hình của tôi, nhưng mã của tôi vẫn như chính xác như vậy. Sự linh hoạt này có thể cực kỳ hữu ích và dễ bảo trì. Nhược điểm của điều này là tôi chỉ có thể thực hiện các hoạt động cơ sở dữ liệu 'chung' và có thể không tận dụng hết sức mạnh mà mỗi nhà cung cấp cụ thể cung cấp như vậy với mọi thứ trong lập trình bạn có giao dịch và bạn phải xác định kịch bản nào sẽ mang lại lợi ích cho bạn nhiều nhất.

Bộ sưu tập:

Nếu bạn nhận thấy hầu hết các bộ sưu tập cài đặt giao diện này được gọi là IEnumerable. IEnumerable trả về một IEnumerator có MoveNext(), Current, và Reset(). Điều này cho phép C# dễ dàng di chuyển qua bộ sưu tập của bạn. Lý do nó có thể làm điều này là vì nó cho thấy giao diện IEnumerable nó biết rằng đối tượng phơi bày các phương thức mà nó cần phải trải qua nó. Điều này làm hai việc. 1) vòng foreach bây giờ sẽ biết làm thế nào để liệt kê các bộ sưu tập và 2) bây giờ bạn có thể áp dụng mạnh mẽ LINQ exprssions để bộ sưu tập của bạn. Một lần nữa lý do tại sao các giao diện lại hữu ích ở đây là bởi vì tất cả các bộ sưu tập đều có thứ gì đó trong COMMON, chúng có thể được chuyển qua. Mỗi bộ sưu tập có thể được chuyển qua một cách khác (danh sách liên kết so với mảng) nhưng đó là vẻ đẹp của giao diện là việc triển khai được ẩn và không liên quan đến người tiêu dùng của giao diện. MoveNext() cung cấp cho bạn mục tiếp theo trong bộ sưu tập, nó không quan trọng CÁCH nó làm điều đó. Đẹp quá nhỉ?

Polymorphism

Khi bạn đang thiết kế giao diện riêng của bạn, bạn chỉ cần phải tự hỏi mình một câu hỏi. Những thứ này có điểm chung là gì? Một khi bạn tìm thấy tất cả những thứ mà các đối tượng chia sẻ, bạn trừu tượng hóa các thuộc tính/phương thức đó thành một giao diện để mỗi đối tượng có thể kế thừa từ nó. Sau đó, bạn có thể lập trình chống lại một số đối tượng bằng cách sử dụng một giao diện.

Và tất nhiên tôi phải đưa ra ví dụ đa hình C++ yêu thích của mình, ví dụ về động vật. Tất cả các loài động vật đều có đặc điểm nhất định. Cho phép nói rằng họ có thể di chuyển, nói chuyện, và tất cả đều có một tên. Vì tôi vừa xác định được tất cả các loài động vật của tôi có điểm chung và tôi có thể tóm tắt những phẩm chất đó vào giao diện IAnimal. Sau đó, tôi tạo ra một đối tượng Bear, một đối tượng Owl và một đối tượng Snake tất cả đều triển khai thực hiện giao diện này.Lý do tại sao bạn có thể lưu trữ các đối tượng khác nhau cùng nhau thực hiện cùng một giao diện là vì các giao diện đại diện cho một sự thay thế IS-A. Một con gấu IS-A động vật, một con vật IS-A cú, do đó, nó làm cho vì tôi có thể thu thập tất cả chúng như là Động vật.

var animals = new IAnimal[] = {new Bear(), new Owl(), new Snake()} // here I can collect different objects in a single collection because they inherit from the same interface 

foreach (IAnimal animal in animals) 
{ 
    Console.WriteLine(animal.Name) 
    animal.Speak() // a bear growls, a owl hoots, and a snake hisses 
    animal.Move() // bear runs, owl flys, snake slithers 
} 

Bạn có thể thấy rằng mặc dù những con vật này thực hiện mỗi hành động theo một cách khác, tôi có thể lập trình đối với họ tất cả trong một mô hình thống nhất và điều này chỉ là một trong nhiều lợi ích của giao diện. Vì vậy, một lần nữa điều quan trọng nhất với giao diện là những gì các đối tượng có điểm chung để bạn có thể lập trình chống lại các đối tượng DIFFERENT theo cách CÙNG. Tiết kiệm thời gian, tạo ra các ứng dụng linh hoạt hơn, ẩn tính phức tạp/triển khai, mô hình các đối tượng/tình huống trong thế giới thực, cùng với nhiều lợi ích khác.

Hy vọng điều này sẽ hữu ích.

+2

Câu trả lời hay. –

+0

Một trong những giải thích tốt nhất về lý do đằng sau việc sử dụng giao diện. – rajibdotnet

+0

Đánh dấu câu trả lời này. +1. – Jogi

6

Giao diện là Hợp đồng cho những gì lớp học có thể làm, điều này có nghĩa là một lớp duy nhất có thể thực hiện nhiều hợp đồng S.

Lớp trừu tượng là mẫu cho lớp nên hoạt động như thế nào, bạn chỉ có thể điền một mẫu cho mỗi lớp.

Lớp mở rộng có đối tượng hiện có và chức năng thêm/thay đổi, bạn chỉ có thể mở rộng một lớp cha mẹ cho mỗi lớp.

Bạn sẽ sử dụng hợp đồng (Giao diện) nếu bạn muốn mô tả cách thức hoạt động của một hành động cụ thể mà không cần xác định triển khai cụ thể. Hợp đồng này có thể được thực hiện bởi bất kỳ lớp nào khác thực hiện các phương thức/thuộc tính được định nghĩa.

Bạn sẽ sử dụng lớp trừu tượng nếu bạn muốn chỉ định một phần chức năng ở phía trước và sau đó thêm vào nó.

EDIT: Hãy xem xét điều này:

Bạn có một ứng dụng mà cần phải lưu trữ một số dữ liệu nói EntityA nhưng bạn có thể có nhiều cách mà bạn có thể lưu trữ dữ liệu (ví dụ như xml, cơ sở dữ liệu SQL, CSV vv). Bạn có thể tạo một lớp cho mỗi phương thức khác nhau để lưu trữ EntityA. nhưng khi bạn muốn thay đổi phương pháp, bạn sẽ cần phải xác định rõ ràng loại bạn muốn ngay tại đó.

tức

public class DoStuffWithEntityA{ 
    public void DoStuffAndStoreAsXml(EntityA entity){ /*Logic*/} 
    public void DoStuffAndStoreAsCsv(EntityA entity){ /*Logic*/} 
    public void DoStuffAndStoreInDatabase(EntityA entity){ /*Logic*/} 
} 

prehaps một cách tốt hơn ở đây là sử dụng một giao diện trong đó mô tả nói chung những gì một cái gì đó mà các cửa hàng EntityA sẽ trông như thế nào.

ví dụ

public interface IStoreEntityA{ 
    void Store(EnitityA entity); 
} 

sau đó bạn chỉ có thể nói rằng bạn muốn một cái gì đó mà các cửa hàng EntityA trong mã của bạn

public class DoStuffWithEntityA{ 
    private IStoreEntityA _entityAStorer; 
    public DoStuffWithEntityA(IStoreEntityA howIStoreEntityA){ _entityAStorer = howIStoreEntityA;} 
    public void DoStuff(EntityA entity) 
    { 
     //Do Stuff 
     _entityAStorer.Store(entity); 
    } 
} 

Điều này có nghĩa isnt logic của bạn chặt chẽ cùng với cách bạn lưu trữ EntityA

+0

Cảm ơn câu trả lời của bạn. Nhưng nếu bạn đọc bản chỉnh sửa mới của tôi, bạn sẽ hiểu những gì đang xảy ra trong đầu tôi. Sẽ rất hữu ích nếu bạn cho tôi một số ví dụ. Thx –

+0

Xem chỉnh sửa của tôi cho một kịch bản ở đây, về cơ bản đôi khi bạn có thể không muốn/cần phải biết làm thế nào một cái gì đó được thực hiện, do đó bạn chỉ cần yêu cầu bất cứ điều gì mà thực hiện một hợp đồng cụ thể. –

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