Tại sao chúng tôi sử dụng Giao diện? Nó chỉ dành cho Tiêu chuẩn hóa? [đóng cửa]


79

Tại sao chúng tôi sử dụng Giao diện?

Nó chỉ dành cho Tiêu chuẩn hóa?


1
như trái ngược với...? giao diện có nhiều công dụng ...
Jason

6
Tôi thực sự ước rằng mọi người sẽ không đặt các thẻ như c # trên các bài đăng không cụ thể về c #. Đó là một câu hỏi thực sự tuyệt vời, và tôi có thể đã bỏ lỡ nó vì c # là một thẻ bị bỏ qua.
Tyler Carter

Câu trả lời:


171

Mục đích của Giao diện

  • tạo phần mềm kết hợp lỏng lẻo
  • hỗ trợ thiết kế theo hợp đồng (người triển khai phải cung cấp toàn bộ giao diện)
  • cho phép phần mềm có thể cắm được
  • cho phép các đối tượng khác nhau tương tác dễ dàng
  • ẩn chi tiết triển khai của các lớp với nhau
  • tạo điều kiện sử dụng lại phần mềm

Tương tự 1 : Giống như tàu con thoi của Mỹ, tàu vũ trụ Soyuz của Nga và tàu vũ trụ Thần Châu 5 của Trung Quốc đều có thể cập bến Trạm vũ trụ quốc tế, vì chúng có cùng một giao diện lắp ghép. (Đây chỉ là một ví dụ - tôi không biết nó có đúng trong đời thực hay không, tuy nhiên, hãy tạm ngưng sự hoài nghi của chúng ta để làm ví dụ)

Tương tự 2 : Giống như bạn có thể cắm nhiều màn hình máy tính khác nhau vào máy tính ở nhà. Bạn có thể cắm một chiếc TV cỡ treo tường vào đó, một chiếc CRT cũ (loại dày), một màn hình phẳng 20 inch hoặc một máy chữ nổi để người mù có thể "nhìn" bằng cách chạm. Có khả năng tương thích giữa các thiết bị khác nhau / khác nhau này và máy tính vì tất cả đều thống nhất về tiêu chuẩn giao diện.

Chi tiết về giao diện C # - Với giao diện C # / OOP, bạn đang làm điều tương tự nhưng trong thế giới ảo / vô hình.

Bạn đúng về tiêu chuẩn , mà còn linh hoạt , khả năng mở rộng , khả năng mở rộng , bảo trì , tái sử dụng , testabilitysức mạnh .

(Bạn càng sử dụng nhiều giao diện phần mềm thì những "từ buzz" này sẽ được hiểu nhiều hơn. Và hãy luôn xem xét các giao diện trong thế giới thực vì chúng đã làm chúng ta tốt như nhau.)


18
Bạn đã bỏ qua cách sử dụng giao diện yêu thích của tôi: khả năng kiểm tra. Nếu tôi có hai lớp, A & B và A.foo gọi B.bar, thì miễn là B triển khai một giao diện và có thể được "tiêm" vào A, thì tôi có thể sử dụng một lớp giả, giả hoặc sơ khai thay vì thực B. Điều này đặc biệt hữu ích khi A.foo thay đổi hành vi của nó dựa trên giá trị trả về từ B.bar. (Giả sử B.bar trả về bool. A.foo có thể có câu lệnh if (B.bar) với mệnh đề else.) Sử dụng giao diện trong B cho phép tôi tạo mockB, fakeB và / hoặc steB cho phép tôi kiểm tra những gì xảy ra khi B.bar trả về true hoặc false.
aridlehoover

@Alan R-khả năng kiểm tra được thêm vào. Cảm ơn.
John K

1
Câu trả lời được chấp nhận là nội dung HÀNG ĐẦU và thật mới mẻ khi thấy khái niệm này không bị loại bỏ vì hầu hết các tài liệu hướng dẫn thiết kế khung không giải thích hoặc hiểu được nó. Chỉ cần nói thêm rằng nếu bạn đang sử dụng Generics một cách nghiêm túc, tôi không biết bạn đã làm thế nào mà không có chúng.
rama-JKA toti

6
+1 chostandardization, but also flexibility, scalability, extensibility, maintainability, reusability, testability and power.
Ravi

29

Một giao diện được sử dụng để mô tả những gì một thứ được triển khai có thể làm. Vì vậy, bạn có thể xử lý một số đối tượng triển khai cùng một giao diện như một loại giao diện này.

Ví dụ:

public interface IMyInterface{
    public void DoFirst();
    public int DoSecond();
}


public class A : IMyInterface{
   //class has to implement DoFirst and DoSecond
   public void DoFirst(){
     Console.WriteLine("Blubb1");  
   }

   public int DoSecond(){
     Console.WriteLine("Blubb2");
     return 2;  
   }
}

public class B : IMyInterface{
   //class has to implement DoFirst and DoSecond
   public void DoFirst(){
     Console.WriteLine("Blibb1");  
   }

   public int DoSecond(){
     Console.WriteLine("Blibb2");  
     return 4;
   }
}

Các lớp triển khai Giao diện theo một số cách. Nhưng bạn có thể sử dụng chúng như IMyInterface. Ví dụ:

public static void DoMethodsInInterface(IMyInterface inter){
    inter.DoFirst();
    inter.DoSecond();
}


public static void main(){

   DoMethodsInInterface(new A());
   DoMethodsInInterface(new B());
   //Or use it in a List
   List<IMyInterface> interlist = new List<IMyInterface>();
   interlist.Add(new A());
   interlist.Add(new B());
   foreach(IMyInterface inter in interlist){
      inter.DoFirst();
   }

}

Tôi hy vọng điều này làm rõ một chút tại sao giao diện lại hữu ích.


2
Câu hỏi này được liên kết từ một câu hỏi hỏi tại sao phải sử dụng các giao diện thay vì chỉ đơn giản là có các thành viên thực hiện các chức năng thích hợp, v.v. và câu trả lời của bạn gần nhất với câu trả lời đó. Nếu cả hai lớp không liên quan đều có một phương thức Woozle, thì bất kỳ mã nào muốn chấp nhận một tham chiếu đến một trong hai lớp và Woozlenó sẽ phải biết nó đang xử lý lớp nào và chỉ có thể với Woozlecác lớp mà nó biết. Ngược lại, nếu cả hai lớp đều triển khai IWoozler, thì mã được cung cấp bất kỳ IWoozlercó thể có Woozlemà không cần biết chính xác kiểu của nó.
supercat

Câu trả lời này đóng đinh nó tốt hơn bất kỳ câu nào tôi đã thấy. Đó là tất cả về những gì một đối tượng có thể làm. Các giao diện chỉ định một tập hợp các hành động liên quan đến đối tượng mà không chỉ định những gì xảy ra trong các hành động đó rõ ràng sẽ là đối tượng cụ thể.
m12lrpv

5

Nó để giao tiếp :), để bạn có thể giao tiếp giữa các thứ, nó hữu ích khi bạn có

  • nhiều triển khai của cùng một thứ
  • khi bạn áp dụng một giao diện cho nhiều lớp khác nhau bởi vì bạn cần một số quy ước rằng các lớp này sẽ có thể thực hiện một số công việc hoặc có một số chức năng

3

Đây là chế độ xem cấp cao ...

Các giao diện đóng một vai trò lớn trong khái niệm Ẩn thông tin .

Về cơ bản, chúng giúp bạn ẩn chi tiết triển khai của lớp để một lớp gọi không phụ thuộc vào việc triển khai đó. Do đó, bằng cách sử dụng các giao diện, bạn có thể sửa đổi việc triển khai mà không cần thay đổi lớp gọi. Tất cả điều này lần lượt hạn chế sự phức tạp của mã của bạn và giúp dễ bảo trì hơn về lâu dài.

Khi tôi lần đầu tiên bắt đầu hiểu về các giao diện, chúng được giải thích với tôi như một "hợp đồng cung cấp mô tả về lớp của bạn." Không chắc liệu điều đó có giúp ích cho bạn không nhưng nếu bạn nghĩ về một giao diện cho một chiếc ô tô, bạn có thể nói rằng nó sẽ lái , ngắtquay . Vì vậy, miễn là nó đưa tôi từ điểm A đến điểm B, tôi không thực sự phải biết những chức năng đó được triển khai như thế nào.


2

Lý do chính mà các giao diện được sử dụng trong các ngôn ngữ như C # / Java là vì những ngôn ngữ đó không hỗ trợ nhiều (lớp) kế thừa (xem vấn đề chính xác với đa kế thừa là gì? ).

Nhưng việc triển khai nhiều (giao diện) được phép cho phép sử dụng các lớp theo những cách khác nhau.


1
Giao diện trong các ngôn ngữ được quản lý KHÔNG phải là sự thay thế cho đa kế thừa. Và, ngay cả trong các ngôn ngữ hỗ trợ đa kế thừa, khái niệm triển khai không có giao diện là tương đối và hữu ích. (Xem tiêm phụ thuộc.)
aridlehoover

1
-1 không được suy nghĩ kỹ lưỡng, hoặc bạn thực sự không hiểu C # hoặc Java?
John Saunders

Tất cả những gì tôi muốn nói là trong C ++, các lớp trừu tượng thuần túy có thể được sử dụng thay cho giao diện. Hầu hết những điều bạn có thể làm trong Java / C # với các giao diện mà bạn có thể làm trong C ++ với các lớp trừu tượng thuần túy. Trong C ++ nếu bạn muốn một lớp có nhiều hành vi, bạn sẽ kế thừa nhiều lớp trừu tượng thuần túy. Nhưng bạn không thể làm điều đó trong Java / C #. Tôi không nói rằng giao diện không "hữu ích", tôi đang nói nhiều hơn thế: các ngôn ngữ như Java & C # sẽ không thực sự là ngôn ngữ lập trình hướng đối tượng nếu không có sự kế thừa đa giao diện. (họ không cho phép đa kế thừa lớp cũng không mixins)
Catalin Dicu

1
+1 Về cơ bản, đây là những gì đã được khám phá một cách khó khăn bằng kinh nghiệm của C # và Java. Nếu bạn cố gắng đơn giản hóa bằng cách tránh đa kế thừa, bạn chỉ tạo ra sự phức tạp ở nơi khác. Do thiếu một cách tiếp cận cơ bản thống nhất, bạn sẽ gặp phải vấn đề phức tạp hơn. Xem chú thích của Krzystof Cwalina trong Ngôn ngữ lập trình C # Phiên bản thứ 3 , 1.9 Giao diện, nói chính xác điều này. Hiện tại, vẫn còn những vấn đề chưa được giải quyết trong C # và Java mà sẽ có các giải pháp đơn giản nếu cho phép đa kế thừa các lớp.
Daniel Earwicker

-1 kế thừa và giao diện thực sự rất khác nhau.
kenny 13/10/10

2

Các giao diện hơi khó xử. Họ hỗ trợ thiết kế theo hợp đồng chỉ bằng cách tin rằng, cùng một tên và giao diện được triển khai có nghĩa là cùng một hành vi. Điều này chỉ hoạt động nhờ vào tài liệu API, nó phải được con người kiểm tra. Điều đó làm cho các giao diện quá yếu. Một cách để giải quyết vấn đề đó có thể là thông số kỹ thuật chính thức. Mặt khác, các giao diện quá mạnh, quá nghiêm ngặt. Bạn không thể phát triển các giao diện thường bị cản trở khi sử dụng lại. Điều này được giải quyết bởi các giao thức - cơ chế trong ngôn ngữ động, gửi tin nhắn (phương thức gọi) và khi tin nhắn đó không được hỗ trợ bởi bộ thu, cuộc gọi lại tiêu chuẩn sẽ được gọi. Có các giao thức cụ thể với các ràng buộc sẽ tốt hơn.


1

Nghĩ rằng hối hận ...

Có một khách hàng và một máy chủ liên quan ở đây. Hãy nói rằng họ được tách biệt về mặt vật lý bởi internet. Máy khách đang gọi một phương thức mà việc thực thi thực sự xảy ra trên máy chủ. Từ quan điểm của khách hàng, khách hàng không biết bất cứ điều gì về đối tượng trong máy chủ thực hiện việc thực thi. Tuy nhiên nó biết phương pháp nào để gọi. Bởi vì trong khi xây dựng chương trình khách hàng, chúng ta chỉ tiếp xúc với một giao diện (hoặc hợp đồng). Chúng tôi không được tiếp xúc với toàn bộ đối tượng đang thực sự sống trên máy chủ. Hãy thử thực hiện một số ứng dụng demo trong .net Remoting, và bạn sẽ hiểu phần còn lại. Chúc bạn lập trình vui vẻ.


0

Tại sao chúng tôi sử dụng giao diện?

Một số ngôn ngữ thực hiện các cuộc gọi phương pháp đa hình sử dụng vtables và loại bỏ hầu hết các loại thông tin làm cho nó khó không để xác định các giao diện.

Vì vậy, đôi khi chúng tôi chỉ sử dụng giao diện vì thiết kế ngôn ngữ yêu cầu nó.


0

Bằng cách bắt đầu với một giao diện, bạn có thể triển khai proxy , do đó cho phép tải chậm hoặc thực hiện một số xác minh khi gọi các phương thức triển khai cụ thể.


0

Giao diện phân tách kiểu dữ liệu khỏi logic thực thi.


0

Giao diện cung cấp phương thức nguyên mẫu chỉ chứa tuyên bố về chức năng của một hành vi cụ thể.

và nếu bạn muốn triển khai hành vi này vào lớp thì bạn phải triển khai giao diện này trong lớp sau đó lớp có chức năng hành vi này hoặc nó có thể có nhiều hành vi.

bởi vì lớp có thể triển khai nhiều giao diện.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.