2009-09-08 9 views
5

定義によれば:C位 - プロパティ解明

「インターフェース自体が目的ではないように、私はit.Ifインターフェイスを初期化することができないがfiledsを宣言させ、それが保管場所を必要としますので、私たちはインターフェイス内のフィールドを宣言することはできません。プロパティの包みなさい

私はインターフェイス

string SayHello { get; set; } 

を宣言するとき、私は私 が見ることができる分解するとき

それが内部(ILにget_SayHello() ,set_SayHello()としてフックされ例を言いますgetおよびsetメソッド)。

私の質問は、プロパティがプロパティ宣言

がインターフェイス内で許可されているか、その後、いくつかの保管場所を必要とまだあります。

編集: これは、私は私があなたの助けを求めている、C#に新しいですunderstood.Asものです。

答えて

13

あなたはやや間違った前提で操作していますが、そのプロパティにはバッキングフィールドが必要です。はいプロパティはバッキングフィールドを使用しますが、これは必須条件ではありません。

class C1 : IFoo { 
    public string SayHello { 
    get { return "Say Hello"; } 
    set { } 
    } 
} 
+3

@Downvoter、理由を与えるために気をつけますか? – JaredPar

+0

おそらく競争力がある。 – Skurmedel

+0

これは明らかです。 – user160677

6
インターフェースのプロパティの宣言は任意の実装クラスは、このような方法( get_SayHelloset_SayHelloが、プロパティとして定義)を持っている必要がありますが指定されていないと言う

を次のように私は、例えば無バッキングフィールドを使用してインターフェイスを実装することができますどのように実装されていますか。つまり、あなたのできることが、今はどのように行われているのかがわかります(SayHello "文字列"を取得し、SayHello "文字列"を設定することができます)。したがって、具体的には、インターフェイスのプロパティを定義することは、フィールドの裏付けについては何も言いません。

また、プロパティにはバッキングフィールドが必要であると誤解されています。以下はそうではありません。

class Example { 
    public string SayHello { 
     get { 
      return "Hello, World!"; 
     } 
     set { } 
    } 
} 

プロパティは、フィールドのような構文でアクセスできる単なるメソッドです。フィールドではなくメソッドであるため、インターフェイスとして定義することができます。

2

私の質問は、プロパティが 本当ではない、いくつかの保管場所

必要がまだあります。あなたはゲッター/セッターで何でもできます。インターフェイスでプロパティを宣言することによって、実装者にゲッタやセッタを提供するように強制するだけです。

1

まあ、インタフェース内の宣言は、そのインタフェースのインスタンスに存在すると予想されるメンバーを示しています。どのように実装されているか、どこに保存されているかについては何も教えてくれません。

私はあなたがクラスのインターフェースとインターフェースのコンセプトを混同していると思います。インターフェイスをインスタンス化するのではなく、インターフェイスを実装するクラスをインスタンス化します。

4

ジャレッドによれば、このプロパティは必ずしもストレージの場所を必要としませんが、あなたはまだそれを考えすぎていると私は信じています。インタフェースで

public interface IFoo 
{ 
    string get_SayHello(); 
    string set_SayHello(string value); 
} 

ジャスト方法:

は、あなたのインターフェイスが実際にした想像してみてください。あなたはそれに満足していますか?もしそうなら、それは本当にすべてのプロパティであり、これらのメソッドを結びつけるためのメタデータも少しあります。フィールドとは何の関係もありません。メソッドだけです。

実装者は、フィールドを使用することもできますが、これはインターフェイスとは完全に別です。

3

インターフェイスでこのようなプロパティを宣言すると、インターフェイスを実装するすべてのクラスでそのプロパティを実装する必要があります。これらのクラスは、(自動プロパティとして、または他のより複雑な手段を介して)適切に表示される任意の方法でプロパティを自由に実装できます。

次のインタフェースで、あなたのプロパティを変更:

string SayHello { get; } 

実装するクラスのみがそのプロパティのゲッターを実装する必要があります。しかし、インタフェースのレベルでストレージの割り当ては行われません。

2

すべての.NET言語がプロパティの概念を持っているわけではありません。そのため、インターフェイスでは、プロパティのget_およびset_バージョンも定義して、どの.NET言語でもその型を使用できるようにする必要があります。これはあなたの混乱につながるかもしれません。

+0

.netで読み書き可能なプロパティを持つことは、意味的には読み込み専用のプロパティとは意味が異なり、プロパティのみ?例えば、 'IReadableFoo'を読み込み専用プロパティ' Foo'と 'IWritableFoo'を同じ名前の書き込み専用プロパティで指定すると、両方を継承するインターフェースIReadWriteFooは、有用であるために3番目の読み込みを定義する必要があります-writeプロパティ。どのようにプロパティを理解していない言語でそれを行うだろうか? – supercat

+0

@supercat:この(ひどい)回答(私は間もなく削除予定)や質問に関連するのはどういうものかわかりません。あなたの質問には、「CLS準拠」の一部と「地獄はあなたが喫煙ですか?」という回答があります。 – Will

+0

言語がプロパティを知らない場合、それを含むインターフェイスの実装を記述するための方法はありますか? – supercat