2014-02-07 56 views
4

在启动时,我将所有的app.config值加载到名为ConfigValues的类中。我的数据库只需要它们中的一部分,因此我有一个IDatabaseConfig接口,它只指定它需要的参数。这样,当我创建一个数据库连接类和构造函数注入时,我可以要求它传递任何实现了IDatabaseConfig的东西。在VB.NET中使用单个属性实现多个接口

我想要做的是在ConfigValues类上声明多个接口,并允许某些属性同时实现多个合同。

这里是一个小的代码示例:

Public Interface IAppConfig 
    Property Server As String 
    Property ErrorPath As String 
End Interface 

Public Interface IDatabaseConfig 
    Property Server As String 
End Interface 

Public Class ConfigValues 
    Implements IAppConfig 
    Implements IDatabaseConfig 

    Public Property ErrorPath As String Implements IAppConfig.ErrorPath 

    'need different syntax - does not compile: 
    Public Property Server As String Implements IAppConfig.Server, 
            Implements IDatabaseConfig.Server 

End Class 

在VB.NET中,有没有指定一个属性满足多个接口的合同呢?

这与SO上的这两个问题完全相反,它们试图将相同的接口名称分成两个不同的属性。


作为cludgy解决办法,我能有这两个属性是指相同的后盾属性,但我不得不改变属性名至少其中之一,它改变了API。

Private _server As String 
Public Property ServerForApp As String Implements IAppConfig.Server 
    Get 
     Return _server 
    End Get 
    Set(value As String) 
     _server = value 
    End Set 
End Property 
Public Property ServerForDatabase As String Implements IDatabaseConfig.Server 
    Get 
     Return _server 
    End Get 
    Set(value As String) 
     _server = value 
    End Set 
End Property 
+0

我现在不VB,但在其他.NET语言,你会写一个继承第三接口IBoth另外两个接口,你的财产将使用IBoth作为类型。 –

+0

顺便说一句,即使你“至少改变了其中一个属性名称”,那也不会“改变API”:有一个变量'v As IAppConfig'指向这个对象的客户端,仍然会引用属性作为'v.Server',即使声明是'Property ServerForApp ..'。 VB在编译时管理名称映射。 (如果VB没有这样做,这个类将不能通过这个接口使用,这显然不是一个有用的语言设计。) – ToolmakerSteve

回答

7

我想你想支持什么,你刚刚得到的语法错误:

Public Class ConfigValues 
    Implements IAppConfig 
    Implements IDatabaseConfig 

    Public Property ErrorPath As String Implements IAppConfig.ErrorPath 

    Public Property Server As String Implements IAppConfig.Server, 
               IDatabaseConfig.Server 

End Class 
+1

是的! Dadoy!我尝试了':'和'''等一大堆其他的东西,但我一再重复'Implements'这个词。这是诀窍。谢谢! – KyleMit