2017-06-30 15 views
2

以下のコードを参照してください。 Visual Studio 2017では、IGetSet.ValueがプロパティIGet.Valueを隠していることを示しています。これが意図されている場合は、newキーワードを追加する必要があります。私は、クラスに関してプロパティを隠すという概念を理解していますが、インタフェースに関しては、メッセージの意味はわかりません。 newキーワードを追加するかどうかは、もちろん動作の違いはありません。インターフェイスAがインターフェイスBのプロパティを非表示にする理由

この2つのインターフェイスを積み重ねたいのは、読み取り/書き込みインターフェイスを実装するオブジェクトを、値の取得のみが許可されているメソッドで使用できるようにしたいからです。

は今私の質問は以下のとおりです。

  1. これは私が欲しいものを達成するための方法ですか?私は、「隠れている」というメッセージが、「あなたはおそらくやりたくないことをここでやっている、違ったやり方で解決しようとしている」というシグナルとして表示されています。
  2. 1つのインターフェイスで他のインターフェイスのプロパティを非表示にする方法はありますか?インターフェイスの実装に依存しませんか?だからなぜメッセージ?

    public interface IGetSet : IGet 
    { 
        new string Value { get; set; } 
    } 
    
    public interface IGet 
    { 
        string Value { get; } 
    } 
    
    public class Tester : IGetSet 
    { 
        public string Value { get; set; } 
    } 
    
    [Test] 
    public void InterfaceTest() 
    { 
        IGetSet tester = new Tester(); 
        tester.Value = "My Value"; 
        IGet getteronly = tester; 
        var value = getteronly.Value; 
    } 
    

私は、このコンパイルエラーIGet.Value 'と 'ISet.Value 'の間CS0229あいまい'''

public interface ISet 
{ 
    string Value { set; } 
} 

public interface IGet 
{ 
    string Value { get; } 
} 

public interface IGetSet : IGet, ISet 
{ 

} 
+0

それらを実装する必要が同じ性質を持っている場合。使用方法によってコンパイルエラーが発生します。それを指摘してくれてありがとう。プロパティがコードで使用されていない場合、インターフェイスは実装されていますが、コードは実際にコンパイルされます。それを指摘してくれてありがとう! –

答えて

3

を得るの下のコードでそれを解決しようとするとこれが私が望むものを達成する方法ですか?

はい。

私は、「隠れている」というメッセージは、「あなたはここに何かしていますが、おそらくしたくない、別の方法で解決しようとしています。

いいえ、これは意図的なものかどうか評価する必要があります。 本当に最初のものを上回るプロパティの2番目の定義を作成するつもりでしたか?はい、この場合は行いますが、そうしない場合もあります。だからこそ、あなたが望むものを明示的に伝えるように警告する警告が表示されます。

明示的なインターフェイスの実装を使用するときに注意点として、あなたが実際に両方の性質の異なる実装で終わる可能性が:

public class Tester : IGetSet 
{ 
    string IGet.Value { get { return "A"; } } 

    string IGetSet.Value { get { return "B"; } set { } } 
} 

が警告へのキャッチがありますか?

+0

明示的なインターフェイスにrepsectを指定します。インタフェースIGetSetを使用してオブジェクトにアドレス指定すると、IGet.Valueは表示されません。だからそこに隠れることはないと私は言うだろう。また、Testerのインスタンスがある場合、明示的な実装のためにValueプロパティは表示されません。だから私はまだ財産が隠されているというメッセージには同意しない。 –

+0

隠しがあります: 'get'プロパティが表示されません。あなたはあなたのインターフェースで 'Value'の定義を置き換えています。 –

+0

はい、今見ます!なんて暖かい気持ち、光、私は君主の光を抱きしめる!ちょうどここでいくつかの楽しみがある。ありがとう! –

0

両方のインターフェイスでは、インターフェイスが暗黙的に実装されており、プロパティはコードで使用されているときにのみ起こるEvk3この@明示的

public interface ISet 
{ 
    string Value { set; } 
} 

public interface IGet 
{ 
    string Value { get; } 
} 

public class GetSetClass : IGet, ISet 
{ 
    public string Value { get; set; } 
    string IGet.Value // Explicitly implementation 
    { 
     get { return Value; } 
    } 

    string ISet.Value // Explicitly implementation 
    { 
     set { Value = value; } 
    } 
} 
+0

いいえ、インターフェイス定義のプロパティを実際にオーバーライドする必要はありません。これが最初のコードサンプルです。 2番目のものは不必要で、私の意見ではそれ以上の悪をもたらすでしょう。 –

+0

@PablonotPicassoこれは私の意見では読み取り専用の制限を達成するために不必要なコードが必要なので、これは私の後ではありません。 –

関連する問題