web-dev-qa-db-ja.com

インターフェイスに変数を含めることはできますか?

可能性のある複製:
C#インターフェースにフィールドを含めることができないのはなぜですか?

こんにちは、みんな、

Jon Skeetは、プロパティの使用は変数によって支えられているという質問に答えました。

ただし、インターフェイスのプロパティはC#で許可されています。それは、C#のインターフェイスに変数を含めることができ、プロパティによってサポートされる変数がどのように処理されるかを意味しますか?

前もって感謝します。

33
Sandeep

いいえ。インターフェイスにフィールドを含めることはできません。

インターフェイスはプロパティを宣言できますが、その実装を提供しないため、バッキングフィールドはありません。クラスがインターフェイスを実装する場合にのみ、バッキングフィールド(または自動プロパティ)が必要です。

25
Andrew Cooper

インターフェイスは、名前空間またはクラスのメンバーになることができ、次のメンバーの署名を含めることができます。

Methods

Properties

Indexers

Events

プロパティはインターフェイスで宣言できます。宣言の形式は次のとおりです。インターフェイスプロパティのアクセサにはボディがありません。

したがって、アクセッサの目的は、プロパティが読み取り/書き込み、読み取り専用、または書き込み専用であるかどうかを示すことです。

例:

// Interface Properties    
interface IEmployee
{
   string Name
   {
      get;
      set;
   }

   int Counter
   {
      get;
   }
}

実装:

public class Employee: IEmployee 
{
   public static int numberOfEmployees;

   private int counter;

   private string name;

   // Read-write instance property:
   public string Name
   {
      get
      {
         return name;
      }
      set
      {
         name = value;
      }
   }

   // Read-only instance property:
   public int Counter
   {    
      get    
      {    
         return counter;
      }    
   }

   // Constructor:
   public Employee()
   {
      counter = ++counter + numberOfEmployees;
   }
}  

メインクラス:

public class MainClass
{
   public static void Main()
   {    
      Console.Write("Enter number of employees: ");

      string s = Console.ReadLine();

      Employee.numberOfEmployees = int.Parse(s);

      Employee e1 = new Employee();

      Console.Write("Enter the name of the new employee: ");

      e1.Name = Console.ReadLine();  

      Console.WriteLine("The employee information:");

      Console.WriteLine("Employee number: {0}", e1.Counter);

      Console.WriteLine("Employee name: {0}", e1.Name);    
   }    
}
24
Abhi

プロパティはインターフェイスで宣言できます(定義されていません)。しかし、インターフェイスプロパティのアクセサ持っていない本文。したがって、アクセッサの目的は、プロパティが読み取り/書き込み、読み取り専用、または書き込み専用であるかどうかindicateになります。

これで MSDN Doc をチェックアウトすると、インターフェイスで定義しないプロパティであることがわかります。代わりに、継承するクラスによって実装が行われます。

interface IEmployee
{
    string Name
    {
        get;
        set;
    }

    int Counter
    {
        get;
    }
}

public class Employee : IEmployee
{
    public static int numberOfEmployees;

    private string name;
    public string Name  // read-write instance property
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }

    private int counter;
    public int Counter  // read-only instance property
    {
        get
        {
            return counter;
        }
    }

    public Employee()  // constructor
    {
        counter = ++counter + numberOfEmployees;
    }
}

インターフェイスIEmployeeでは、プロパティの構文は自動実装プロパティのように見えますが、プロパティがread-writeread-only、またはwrite-only、 これ以上何もない。実装を実行してプロパティを定義するクラスを実装するタスク。

3
Shekhar_Pro

いいえ、それはそれを意味しません。インターフェースは実際にはcontainプロパティでもありません。

インターフェイスを使用するには、クラスが実装済みである必要があることに注意してください。インターフェイスはcontractのみを定義します。つまり、そのインターフェイスを実装するクラスには、インターフェイスによって定義されたすべてのメンバーが含まれます。インターフェースには実際にはこれらのメンバーはありません。テンプレートのようなものです。 implementsインターフェイスであるクラスのインスタンスは、プロパティを含むものであり、したがってプロパティに使用されるプライベートバッキングフィールドです。

インターフェイスは、次のメンバーに対してのみsignaturesを定義できます。

  • 方法
  • 物性
  • インデクサー
  • イベント
2
Cody Gray

いいえ、インターフェースは「契約」にすぎません。プロパティを実装する実装クラス次第です。変数を使用して、または使用しない場合があります。

2
Esteban Araya