9

これは妥当な (そしておそらく単純な?) シナリオのように思えますが、次のことを行うにはどうすればよいでしょうか。

2つのインターフェースがあるとしましょう:

Interface ISimpleInterface
    string ErrorMsg { get; } 
End Interface

Interface IExtendedInterface
    string ErrorMsg { get; set; }    
    string SomeOtherProperty { get; set; }
End Interface

クラスに両方のインターフェースを実装させたい:

Public Class Foo Implements ISimpleInterface, IExtendedInterface

各インターフェイスのアクセス レベルが異なる場合、クラスで ErrorMsg プロパティを定義するにはどうすればよいですか?

ご参考までに、私のシナリオを次に示します。疑似 MVC アーキテクチャを使用して UserControl を作成しています。ここで、UserControl は拡張インターフェイスを Controller に公開し、Simple インターフェイスをコントロールの Consumers に公開します。

ところで、これを VB.NET で実装します (vb で提案された構文を歓迎します)。

4

8 に答える 8

6

申し訳ありませんが、私は VB.Net 構文をマスターしていません。

C# では、インターフェイスを暗黙的または明示的に実装できます。クラス Foo が ErrorMsg をパブリック メソッドとして実装する場合、この実装は両方のインターフェイスに使用されます。

個別の実装が必要な場合は、明示的に実装できます。

string ISimpleInterface.ErrorMsg {get { ... } } 
string IExtendedInterface.ErrorMsg {get { ... } set { ... }} 
于 2009-02-10T12:51:56.240 に答える
5

それらのいずれかまたは両方のインターフェイスを「明示的なインターフェイス」実装で実装できるため、コンパイラはどの ErrorMsg プロパティがどのインターフェイスに属しているかを認識します。

これを行うには、クラス名の後に :ISimpleInterface (C# の場合) を記述し、ISimpleInterface をクリックして、明示的なインターフェイスの実装を選択します。

詳細はこちら: http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx

于 2009-02-10T12:50:19.927 に答える
3

C# では、暗黙的な実装 ( を使用set) は、これらの両方を満たすことができます。

class Foo : ISimpleInterface, IExtendedInterface
{
    public string ErrorMsg { get; set; } 
    public string SomeOtherProperty {get; set;}
}

変更したい場合は、明示的な実装を使用できます (VB の「実装」?) - C# の場合:

string ISimpleInterface.ErrorMsg
{
    get { return ErrorMsg; } // or something more interesting
}
于 2009-02-10T12:52:14.210 に答える
2

VB.NETのImplementsキーワードを使用すると、これが簡単になります。

Public Interface ISimpleInterface
  ReadOnly Property ErrorMsg() As String
End Interface

Friend Interface IExtendedInterface
  Property ErrorMsg() As String
  Property SomeOtherProperty() As String
End Interface

Public Class Foo
  Implements ISimpleInterface, IExtendedInterface
  Private other As String
  Private msg As String

  Public Property ErrorMsgEx() As String Implements IExtendedInterface.ErrorMsg
    Get
      Return msg
    End Get
    Set(ByVal value As String)
      msg = value
    End Set
  End Property

  Public Property SomeOtherPropertyEx() As String Implements IExtendedInterface.SomeOtherProperty
    Get
      Return other
    End Get
    Set(ByVal value As String)
      other = value
    End Set
  End Property

  Public ReadOnly Property ErrorMsg() As String Implements ISimpleInterface.ErrorMsg
    Get
      Return msg
    End Get
  End Property
End Class
于 2009-02-10T13:06:28.747 に答える
0

プライベートサブルーチンにインターフェイスを実装させることができます。オブジェクトがそのインターフェイスタイプの変数に割り当てられている場合にのみ公開されます。

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim S As ISimpleInterface
        Dim Ext As IExtendedInterface
        Dim F As New Foo
        F.ErrorMsg = "Test Error"
        S = F
        Ext = F
        MsgBox(S.ErrorMsg)
        MsgBox(Ext.ErrorMsg)
        MsgBox(F.ErrorMsg)
    End Sub
End Class


Public Interface ISimpleInterface
    ReadOnly Property ErrorMsg() As String
End Interface

Public Interface IExtendedInterface
    Property ErrorMsg() As String
    Property SomeOtherProperty() As String
End Interface

Public Class Foo
    Implements ISimpleInterface, IExtendedInterface
    Private other As String
    Private msg As String

    Public Property ErrorMsg() As String Implements IExtendedInterface.ErrorMsg
        Get
            Return msg
        End Get
        Set(ByVal value As String)
            msg = value
        End Set
    End Property

    Public Property SomeOtherProperty() As String Implements IExtendedInterface.SomeOtherProperty
        Get
            Return other
        End Get
        Set(ByVal value As String)
            other = value
        End Set
    End Property

    Private ReadOnly Property ErrorMsgSimple() As String Implements ISimpleInterface.ErrorMsg
        Get
            Return ErrorMsg
        End Get
    End Property
End Class
于 2009-02-10T13:42:47.710 に答える
0

明示的な実装はこれを解決しますが、他の人が示すように、この場合、おそらく IExtendedInterface に ISimpleInterface を実装させます (ErrorMsg プロパティは意味的に同じプロパティであり、これら 2 つのインターフェイスで同じことを意味します)。

interface ISimpleInterface
{
    string ErrorMessage { get; set; }
}
interface IExtendedInterface : ISimpleInterface
{
    string SomeOtherProperty { get; set; }
}
于 2009-02-10T13:54:08.617 に答える
0

明示的なインターフェイスの実装を使用する必要があります。この件に関する詳細はこちら: http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx

于 2009-02-10T12:51:23.900 に答える