2

私はC#の初心者で、インターフェイスを実装しようとしています。アクセスモディファイアをインターフェイスメソッドに配置できないことはわかっているので、以下の「TestClass2」のパブリック静的「Create」メソッドで「TestValue」にアクセスするにはどうすればよいですか?私が得るエラーは...

「TestClass1」には「TestValue」の定義が含まれておらず、「TestClass1」タイプの最初の引数を受け入れる拡張メソッド「TestValue」が見つかりませんでした

public interface IParent
{
    string TestValue { get; }
}

public class TestClass1 : IParent
{
    string IParent.TestValue
    {
        get { return "hello"; }
    }
}

public class TestClass2
{
    private string _testValue;

    public static TestClass2 Create(TestClass1 input)
    {
        TestClass2 output = new TestClass2();
        output._testValue = input.TestValue;
        return output;
    }
}
4

3 に答える 3

6

具体的な実装にpublicアクセス修飾子を追加します。

public class TestClass1 : IParent
{
    private TestClass1 _testValue; 

    public string TestValue
    {
        get { return "hello"; }
    }
}

編集:実際に明示的なインターフェイスの実装を作成したので、次のSOの質問を参照することをお勧めします:C#インターフェイス。暗黙的な実装と明示的な実装

于 2012-07-12T12:59:08.183 に答える
0

インターフェイスのポイントは、インターフェイスを実装するクラスに対して公的にアクセス可能なコントラクトを定義することであるため、インターフェイス宣言にアクセス修飾子は必要ありません。基本的に、定義でアクセス修飾子を指定しませんが、すべてのメソッド/プロパティはパブリックであると見なされます。

これは、インターフェースを実装するときに、インターフェースのメソッド/プロパティシグネチャと一致するパブリックメソッド/プロパティを提供するように契約上拘束されていることを意味します。

一言で言えば、パブリックアクセス修飾子を具象クラスの実装に追加すれば、あなたは甘くなります。

于 2012-07-12T13:03:34.697 に答える
0

私はそのような解決策を得るためにオブジェクトをインターフェースに変換してみました

public class TestClass2
{
    private string _testValue;

    public static TestClass2 Create(TestClass1 input)
    {
        TestClass2 output = new TestClass2();
        output._testValue =  ((ITestInterface)input).TestValue;
        return output;
    }
}

これも機能しますが、私はより単純なソリューションを好みます。

于 2012-07-28T12:16:46.807 に答える