English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# 基础教程

C# 高级教程

C# 面向对象(OOP)

الواجهة لـ C#

在人类世界中,两个或两个以上的人之间的契约约束他们按照契约行事。同样,接口包括相关功能的声明。实现接口的实体必须提供声明功能的实现。

在C#中,可以使用 interface 关键字定义接口。接口可以包含方法,属性,索引器和事件的声明。但是,它不能包含字段,自动实现的属性。

以下接口声明了文件操作的一些基本功能。

interface IFile
{
    void ReadFile();
    void WriteFile(string text);
{}

您不能将访问修饰符应用于接口成员。默认情况下,所有成员都是公开的。如果在接口中使用访问修饰符,则C#编译器将给出编译时错误“The modifier 'public/private/protected' is not valid for this item.”。(Visual Studio将立即显示错误而不进行编译。)

interface IFile
{
    protected void ReadFile(); //编译时错误
    private void WriteFile(string text);//编译时错误
{}

接口只能包含声明,而不能包含实现。以下将给出编译时错误。

interface IFile
{
    void ReadFile();
    void WriteFile(string text){
        Console.Write(text); //错误:无法实现方法
    {}
{}

实现接口

一个类或一个Struct可以使用冒号(:)实现一个或多个接口。  

语法:

<Class or Struct Name> : <Interface Name>

例如,下面的类隐式地实现了 IFile 接口。

interface IFile
{
    void ReadFile();
    void WriteFile(string text);
{}
class FileInfo : IFile
{
    public void ReadFile()
    {
        Console.WriteLine("قراءة الملف");
    {}
    public void WriteFile(string text)
    {
        Console.WriteLine("الكتابة إلى الملف");
    {}
{}

في المثال السابق، قامت فئة FileInfo بتنفيذ واجهة IFile. تستخدم ميزة الوصول public لتعريف جميع أعضاء واجهة IFile. يمكن أن تحتوي فئة FileInfo أيضًا على أعضاء خارج أعضاء الواجهة.

يجب تنفيذ أعضاء واجهة باستخدام ميزة التزيين public؛ وإلا سيمنحك مبرمج التجميع خطأ في التجميع.

يمكنك إنشاء كائن للفئة، وقم بتعيينه إلى متغير نوع واجهة، مثل ما يلي.

public class Program
{
    public static void Main()
    {
        IFile file1 = new FileInfo();
        FileInfo file2 = new FileInfo();
        file1.ReadFile(); 
        file1.WriteFile("content"); 
        file2.ReadFile(); 
        file2.WriteFile("content"); 
    {}
{}

في المثال أعلاه، قمنا بإنشاء كائن للفئة FileInfo، وقمنا بتعيينه إلى متغير نوع IFile ومتغير نوع FileInfo. عند تنفيذ الواجهة بشكل غير مباشر، يمكنك استخدام متغير نوع IFile ومتغير نوع FileInfo للوصول إلى أعضاء IFile.

تنفيذ محدد

يمكن استخدام <InterfaceName>.<MemberName> لتنفيذ الواجهة بوضوح. عند تنفيذ كلاس لمزيد من الواجهات، يكون التنفيذ المحدد مفيدًا؛ لذا، فإنه يجعل الكود أكثر سهولة في القراءة ويساعد في إزالة الارتباك. إذا كانت لديها نفس اسم الطريقة، فإنها مفيدة أيضًا.

لا تخلط public استخدام ميزات التزيين مع التنفيذ المحدد سيؤدي إلى خطأ في التجميع.
interface IFile
{
    void ReadFile();
    void WriteFile(string text);
{}
    
class FileInfo : IFile
{
    void IFile.ReadFile()
    {
        Console.WriteLine("قراءة الملف");
    {}
    void IFile.WriteFile(string text)
    {
        Console.WriteLine("الكتابة إلى الملف");
    {}
{}

عند تنفيذ واجهة بوضوح، يمكن الوصول إلى أعضاء الواجهة فقط من خلال مثيلات نوع الواجهة.

interface IFile
{
    void ReadFile();
    void WriteFile(string text);
{}
class FileInfo : IFile
{
    void IFile.ReadFile()
    {
        Console.WriteLine("قراءة الملف");
    {}
    void IFile.WriteFile(string text)
    {
        Console.WriteLine("الكتابة إلى الملف");
    {}
    public void Search(string text)
    {
        Console.WriteLine("البحث في الملف");
    {}
{}
public class Program
{
    public static void Main()
    {
        IFile file1 = new FileInfo();
        FileInfo file2 = new FileInfo();
        file1.ReadFile(); 
        file1.WriteFile("content"); 
        //file1.Search("text to be searched")//خطأ في التجميع 
        
        file2.Search("text to be searched");
        //file2.ReadFile(); //خطأ في التجميع 
        //file2.WriteFile("content"); //خطأ في التجميع 
    {}
{}

في المثال السابق، يمكن للعنصر file1 الوصول إلى أعضاء IFile فقط، بينما يمكن للعنصر file2 الوصول إلى أعضاء FileInfo الكلاس. هذا هو محدودية التنفيذ المحدد.

تنفيذ واجهات متعددة

يمكن للفئة أو بنية أن تنفذ واجهات متعددة. يجب عليها تقديم تنفيذ لجميع أعضاء جميع الواجهات.

interface IFile
{
    void ReadFile();
{}
interface IBinaryFile
{
    void OpenBinaryFile();
    void ReadFile();
{}
class FileInfo : IFile, IBinaryFile
{
    void IFile.ReadFile()
    {
        Console.WriteLine("Reading Text File");
    {}
    void IBinaryFile.OpenBinaryFile()
    {
        Console.WriteLine("Opening Binary File");
    {}
    void IBinaryFile.ReadFile()
    {
        Console.WriteLine("Reading Binary File");
    {}
    public void Search(string text)
    {
        Console.WriteLine("Searching in File");
    {}
{}
public class Program
{
    public static void Main()
    {
        IFile file1 = new FileInfo();
        IBinaryFile file2 = new FileInfo();
        FileInfo file3 = new FileInfo();
        file1.ReadFile(); 
        //file1.OpenBinaryFile(); //خطأ في التجميع 
        //file1.SearchFile("text to be searched"); //خطأ في التجميع 
        
        file2.OpenBinaryFile();
        file2.ReadFile();
        //file2.SearchFile("text to be searched"); //خطأ في التجميع 
    
        file3.Search("text to be searched");
        //file3.ReadFile(); //خطأ في التجميع 
        //file3.OpenBinaryFile(); //خطأ في التجميع 
    {}
{}

في الأعلى، تم تنفيذ واجهتين من قبل FileInfo، IFile و IBinaryFile بشكل صريح. يُنصح بتنفيذ الواجهات بشكل صريح عند تنفيذ واجهات متعددة لتجنب التشويه وزيادة القابلة للقراءة.

النقاط الرئيسية التي يجب تذكرها:
  1. يمكن للواجهة أن تحتوي على إعلانات الطرق، الصفات، المؤشرات والمناسبات.

  2. لا يمكن للواجهة أن تحتوي على الأعضاء الخاصة أو المميزة أو الداخلية. بشكل افتراضي، جميع الأعضاء公开.

  3. لا يمكن للواجهة أن تحتوي على الحقول والصفات المميزة التي يتم تنفيذها تلقائيًا.

  4. يمكن للصفحة أو البنية أن تؤدي واجهة واحدة أو أكثر بشكل صريح أو غير صريح. عند تنفيذ الواجهة بشكل غير صريح، يتم استخدام ميزة public، بينما لا يتم استخدامها في الحالة الصريحة.

  5. يتم تنفيذ الواجهة باستخدام InterfaceName. MemberName بشكل واضح.

  6. يمكن للواجهة أن تورث واجهة واحدة أو أكثر.