Giao diện trong C# là gì với ví dụ

⚡ Tóm tắt thông minh

Giao diện trong C# định nghĩa một giao diện.tracPhương thức này chỉ định các phương thức và thuộc tính mà một lớp phải triển khai, mà không cung cấp mã thực tế. Lớp triển khai cung cấp hành vi cụ thể, cho phép liên kết lỏng lẻo và đa kế thừa giữa các kiểu không liên quan.

  • 🔗 vớitract: Giao diện khai báo các chữ ký phương thức và thuộc tính mà mọi lớp triển khai phải định nghĩa.
  • Không có phần mềm triển khai: Giao diện chỉ chứa các khai báo, vì vậy chính lớp sẽ viết mã phương thức thực tế.
  • 🔑 Từ khoá: Từ khóa interface tạo ra kiểu dữ liệu, và một lớp sử dụng dấu hai chấm để triển khai kiểu dữ liệu đó.
  • 🔀 Nhiều giao diện: Một lớp có thể triển khai nhiều giao diện, mang lại cho C# một hình thức kế thừa đa cấp.
  • Giao diện so với abstraclớp t: Giao diện chỉ định nghĩa hành vi, trong khi các thuộc tính tuyệt đối (abs) thì không.tracCác lớp t cũng có thể chứa trạng thái và mã được chia sẻ.
  • 🤖 Hỗ trợ AI: GitHub Copilot tạo khung sườn cho các giao diện và triển khai, và các pipeline ML.NET dựa trên bộ chuyển đổi dựa trên giao diện.tracTs.

Giao diện trong C#

Giao diện trong C# là gì?

An Giao thức Trong C#, nó được sử dụng cùng với một lớp để định nghĩa một con.tracGiao diện (interface) là một thỏa thuận về những gì lớp đó sẽ cung cấp cho ứng dụng. Giao diện định nghĩa các thao tác mà một lớp có thể thực hiện. Giao diện khai báo các thuộc tính và phương thức. Việc xác định chính xác phương thức sẽ làm gì thuộc về chính lớp đó.

Hãy xem ví dụ về giao diện bằng cách thay đổi các lớp trong ứng dụng Console của chúng ta. Lưu ý rằng chúng tôi sẽ không chạy mã vì không có gì có thể chạy bằng giao diện.

Ví dụ về giao diện C#

Hãy tạo một lớp giao diện. Lớp này sẽ được gọi là “Guru99Interface.” Lớp chính của chúng ta sau đó sẽ kế thừa giao diện đã được định nghĩa. Tất cả mã cần được viết trong tệp Program.cs.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 interface IGuru99Interface
 {
  void SetTutorial(int pID, string pName);
  String GetTutorial();
 }

 class Guru99Tutorial : IGuru99Interface
 {
  protected int TutorialID;
  protected string TutorialName;

  public void SetTutorial(int pID, string pName)
  {
   TutorialID = pID;
   TutorialName = pName;
  }

  public String GetTutorial()
  {
   return TutorialName;
  }

  static void Main(string[] args)
  {
   Guru99Tutorial pTutor = new Guru99Tutorial();

   pTutor.SetTutorial(1,".Net by Guru99");

   Console.WriteLine(pTutor.GetTutorial());

   Console.ReadKey();
  }
 }
}

Code Giải trình:-

Ở đây, chúng tôi giải thích các phần quan trọng của mã

Ví dụ về giao diện C#

  1. Trước tiên, chúng ta định nghĩa một giao diện có tên là “Guru99Giao diện.” Lưu ý rằng từ khóa “giao diện” được sử dụng để định nghĩa một giao diện.
  2. Tiếp theo, chúng ta định nghĩa các phương thức sẽ được giao diện của chúng ta sử dụng. Trong trường hợp này, chúng ta định nghĩa các phương thức giống như được sử dụng trong tất cả các ví dụ trước đó. Lưu ý rằng giao diện chỉ khai báo các phương thức. Nó không định nghĩa mã trong các phương thức đó.
  3. Sau đó chúng tôi thực hiện GuruLớp 99Tutorial kế thừa giao diện. Đây là nơi chúng ta viết mã để định nghĩa các phương thức khác nhau được khai báo trong giao diện. Kiểu lập trình này đạt được những điều sau:
    • Điều này đảm bảo rằng lớp học, Guru99Tutorial chỉ thêm đoạn mã cần thiết cho các phương thức “SetTutorial” và “GetTutorial”, không thêm gì khác.
    • Điều này cũng đảm bảo rằng giao diện hoạt động giống như một giao diện điều khiển.tract. Các tốt nghiệp lớp XNUMX phải tuân thủ điều khoản.tracVì vậy, nếu contracNó nói rằng nó nên có hai phương thức gọi là “SetTutorial” và “GetTutorial”, vậy thì nó phải như thế.

Giao diện C# so với lớp AbstracLớp t

Một câu hỏi thường gặp đối với người mới bắt đầu là giao diện C# khác với... như thế nào. abstraclớp tCả hai đều định nghĩa một contracCác loại khác cũng tuân theo quy luật đó, nhưng chúng phục vụ các mục tiêu thiết kế khác nhau.

Những điểm khác biệt chính được liệt kê dưới đây:

  • Thực hiện: Giao diện chỉ chứa các khai báo, trong khi một abs chỉ chứa các khai báo.tracLớp t có thể cung cấp cả abstraccác thành viên và các phương pháp được triển khai đầy đủ.
  • Đa kế thừa: Một lớp có thể triển khai nhiều giao diện nhưng chỉ có thể kế thừa một giao diện duy nhất.traclớp t.
  • Nhà nước: Một cơ bụngtracLớp t có thể chứa các trường, hàm tạo và thuộc tính với dữ liệu, trong khi giao diện không thể lưu trữ trạng thái của đối tượng.
  • Các yếu tố điều chỉnh quyền truy cập: AbstracCác thành viên của lớp t có thể là public, protected hoặc private, trong khi các thành viên của giao diện cổ điển mặc định là public.
  • Trường hợp sử dụng: Sử dụng giao diện để thêm khả năng cho các loại không liên quan, và một abstracLớp t dùng để chia sẻ mã chung giữa các kiểu dữ liệu có liên quan chặt chẽ.

Tóm lại, giao diện mô tả những gì một lớp có thể làm, trong khi phần còn lại (abs) mô tả khả năng thực hiện các chức năng của lớp đó.tracLớp t cũng có thể định nghĩa một phần cách thức thực hiện.

Cách triển khai nhiều giao diện trong C#

Không giống như kế thừa lớp, C# cho phép một lớp duy nhất triển khai nhiều giao diện. Đây là cách ngôn ngữ này cung cấp một hình thức kế thừa đa lớp an toàn mà không gây ra sự mơ hồ phát sinh từ việc kế thừa nhiều lớp cơ sở cùng một lúc.

Để triển khai nhiều giao diện, hãy liệt kê chúng sau tên lớp và phân tách mỗi giao diện bằng dấu phẩy. Sau đó, lớp phải định nghĩa mọi phương thức được khai báo trong mỗi giao diện mà nó triển khai.

Bước 1) Khai báo hai giao diện, mỗi giao diện có phương thức riêng.

Bước 2) Hãy tạo một lớp triển khai cả hai giao diện, phân tách tên giao diện bằng dấu phẩy.

Bước 3) Cung cấp phần thân phương thức cho mỗi thành viên được khai báo trong mỗi giao diện.

Ví dụ bên dưới cho thấy một lớp Document triển khai cả IReadable và một giao diện IWritable.

using System;
namespace DemoApplication
{
 interface IReadable
 {
  void Read();
 }
 interface IWritable
 {
  void Write();
 }
 class Document : IReadable, IWritable
 {
  public void Read()
  {
   Console.WriteLine("Reading the document");
  }
  public void Write()
  {
   Console.WriteLine("Writing to the document");
  }
  static void Main(string[] args)
  {
   Document doc = new Document();
   doc.Read();
   doc.Write();
   Console.ReadKey();
  }
 }
}

Code Giải trình:-

  1. Chúng tôi khai báo hai giao diện, tôiReadable và IWritable. Mỗi giao diện khai báo một phương thức duy nhất không có thân phương thức.
  2. Lớp Document liệt kê cả hai giao diện sau dấu hai chấm, được phân tách bằng dấu phẩy, do đó nó đồng ý tôn trọng cả hai giao diện.tracTs.
  3. Lớp này sau đó định nghĩa các phương thức Read và Write. Bỏ quaping Cả hai phương pháp đều sẽ gây ra lỗi biên dịch.
  4. Phương thức Main tạo ra một đối tượng Document và gọi cả hai phương thức, chứng minh rằng lớp này đáp ứng được hai giao diện.

Khi chương trình chạy, nó sẽ in ra Đọc tài liệu trên dòng đầu tiên và Viết vào tài liệu trên dòng thứ hai. Mẫu này giữ cho mỗi dòng đều như vậy.tracNó nhỏ gọn và tập trung, điều này giúp cho lớp Document dễ kiểm thử và mở rộng hơn.

Ưu điểm của việc sử dụng giao diện trong C#

Giao diện được sử dụng rộng rãi trong các dự án C# chuyên nghiệp vì chúng giúp mã nguồn linh hoạt và dễ bảo trì hơn. Chúng cho phép bạn lập trình theo một cách nhất quán.tracthay vì một lớp cụ thể.

Những lợi thế chính bao gồm:

  • Khớp nối lỏng lẻo: Code Điều này phụ thuộc vào giao diện chứ không phải một lớp cụ thể, vì vậy việc triển khai có thể thay đổi mà không làm hỏng các hàm gọi.
  • Đa kế thừa: Một lớp có thể kế thừa hành vi từ nhiều giao diện, điều mà kế thừa lớp thông thường không cho phép.
  • Khả năng kiểm tra: Giao diện giúp việc thay thế một lớp thực bằng một đối tượng giả lập trong quá trình kiểm thử đơn vị trở nên đơn giản hơn.
  • Tiêm phụ thuộc: Các framework chèn một triển khai giao diện vào thời điểm chạy, một ý tưởng cốt lõi đằng sau các nguyên tắc SOLID.
  • Tính nhất quán: Mỗi lớp triển khai đều bắt buộc phải cung cấp cùng một tập hợp các thành viên, điều này giúp cho API trở nên dễ dự đoán.

Nhờ những lợi ích này, giao diện đóng vai trò cốt lõi trong hầu hết các mẫu thiết kế và khung ứng dụng C# hiện đại.

Câu Hỏi Thường Gặp

Theo quy ước, tên giao diện C# bắt đầu bằng chữ I viết hoa, ví dụ như IDisposable hoặc I.ReadableTiền tố "I" ngay lập tức báo hiệu rằng kiểu dữ liệu đó là một giao diện chứ không phải là một lớp hay cấu trúc.

Trước C# 8.0, một interface chỉ chứa các khai báo. Từ C# 8.0 trở đi, các phương thức mặc định của interface cho phép interface cung cấp phần thân phương thức, do đó các triển khai cũ vẫn hoạt động khi các thành viên mới được thêm vào.

Việc triển khai rõ ràng đặt tên cho một thành viên bằng tiền tố giao diện của nó, chẳng hạn như I.Readable.Đọc. Thành viên này sau đó chỉ có thể được gọi thông qua tham chiếu giao diện, điều này tránh được xung đột tên khi hai giao diện khai báo cùng một phương thức.

Đúng vậy. Một giao diện có thể kế thừa một hoặc nhiều giao diện khác. Một lớp triển khai giao diện con phải định nghĩa mọi phương thức từ cả giao diện con và tất cả các giao diện cha được kế thừa.

Không. Giao diện không thể được khởi tạo trực tiếp vì nó không có phần cài đặt. Bạn tạo một đối tượng của lớp thực thi giao diện đó, sau đó tham chiếu đến đối tượng đó thông qua kiểu giao diện.

Đúng vậy. Các thành viên của một giao diện cổ điển mặc định là public, và bạn không thể thêm các bổ ngữ truy cập cho chúng. Lớp triển khai cũng phải khai báo các thành viên tương ứng là public.

Đúng vậy. GitHub Copilot có thể tạo cấu trúc giao diện, đề xuất chữ ký phương thức và tạo ra một lớp triển khai giao diện đó từ một đoạn chú thích ngắn hoặc tên giao diện, giúp tăng tốc quá trình biên dịch.tracPhát triển đầu tiên.

ML.NET dựa vào các giao diện như ITransformer và IDataView để định nghĩa quy trình xử lý học máy của nó. Việc lập trình dựa trên các giao diện này...tracts cho phép bạn hoán đổi mô hình và nguồn dữ liệu mà không cần viết lại mã huấn luyện xung quanh.

Tóm tắt bài viết này với: