2013-06-20 18 views
3

繼承接口我想實現在一個類中派生接口。我的界面和類與以下類似。命名空間涉及到持有這些接口和類不同的項目:實現與重載成員vb.net

Namespace ns1 

    Public Interface IParent 

     Function myFunction() As Double 

    End Interface 

End ns1 

Namespace ns2 

    Public Interface IDerived 
     Inherits ns1.IParent 

     Overloads/Shadows Function myFunction(ByRef myObject as Object) As Double 

    End Interface 

End ns2 

Namespace ns3 

    Public Class myClass 
     Implements ns2.IDerived 

     Public Function myFunction(ByRef obj as Object) As Double Implements ns2.IDerived.myFunction 

     End Function 

End ns3 

在派生的接口,我試圖重載函數的方式,當我實現派生的接口,我只需要執行函數,如同在上面的「myClass」中的代碼一樣。但是,我收到一個錯誤,說我還必須從父接口(使用空參數列表)實現函數。無論我在派生接口中使用Overloads還是Shadows函數,都存在錯誤 - 都會導致錯誤。

反正有沒有做到我想做的事 - 在我的課只實現派生的接口的功能 - 使用接口?如果沒有辦法使用接口,任何人都可以提出一種替代方法嗎?我們確實需要使用接口,並試圖避免使用類。也就是說,抽象類我允許我們做所有我們需要做的事情。

我讀了大量的信息在所有被這個問題是每一個概念所涉及的主題是非常基本的,並很好地覆蓋在線幫助。但是,我沒有發現任何我認爲是解決具體問題的直接解決方案。

在此先感謝您的幫助。

回答

1

我不知道這是不是一個錯字,但你有兩種截然不同的方法:一個不帶參數,另一個需要一個對象,所以編譯器的要求是合法的。

如果這是一個錯字,並且你只有一個方法,說:「myFunction的()」,那我就不怕VB.Net並不簡單地隱藏在底座接口,並允許只實現像C#派生的一個。

但是你可以很容易地通過轉發解決這個問題:

Namespace ns1 

    Public Interface IParent 

     Function myFunction() As Double 

    End Interface 

End Namespace 

Namespace ns2 

    Public Interface IDerived 
     Inherits ns1.IParent 

     Function myFunction() As Double 

    End Interface 

End Namespace 

Namespace ns3 

    Public Class Class1 
     Implements ns2.IDerived 

     Public Function myFunction() As Double Implements ns2.IDerived.myFunction 
      Return 42 
     End Function 

     Private Function myFunction1() As Double Implements ns1.IParent.myFunction 
      Return myFunction() 
     End Function 
    End Class 

End Namespace 

Module Module1 

    Sub Main() 
     Dim cp As ns1.IParent = New ns3.Class1 
     cp.myFunction() 

     Dim cd As ns2.IDerived = New ns3.Class1 
     cd.myFunction() 
    End Sub 

End Module 

編輯: 所以是不是一個錯字,這裏是標準的(好/最好的做法是什麼?)FIX:

Public Class Class1 
    Implements ns2.IDerived 

    Public Function myFunction(ByRef obj As Object) As Double Implements ns2.IDerived.myFunction 

    End Function 

    Public Function myFunction() As Double Implements ns1.IParent.myFunction 
     Throw New NotImplementedException("'ns1.IParent.myFunction' has not been implemented because unicorns can't fly!") 
    End Function 
End Class 
+0

不,不是錯字。我想重載繼承的方法從派生的父母;這是由於接口所在的不同項目以及每個項目的最終用途所致。簡而言之,ns1項目是ns2項目在特定場景中使用的通用項目。但是,由於ns1也在與ns2不相關的其他場景中使用,我們將它們分開。謝謝回覆。 – llc381

+0

所以會發生什麼是完全可以預料的:你不能只丟掉接口的一部分,因爲使用接口**的代碼需要一個給定的合約**,你必須遵守。如果您永遠不會執行此合約,則可以使用常用的「未實施」模式動態地將其明確地向接口用戶**。我會用樣本更新我的答案。 :) – Pragmateek

+0

好點 - 我們熟悉NotImplementedException :)。我希望接口被處理,以便在派生接口中聲明函數爲「Overloads」或「Shadows」將有效地隱藏基接口函數,並允許我僅使用派生接口函數。當獨角獸回家時,我會再試一次)。在此之前,我只能接受它。我們可能會使用顯式的NotImplementedException - 謝謝您提供簡單(st)解決方案! – llc381

0

我不相信,你要完成什麼是可能的,你正在嘗試的方式......我記得,當你繼承一個接口,實現你的派生接口實際上是被告知,必須實現兩個接口的任何類而是允許您在全班學生中擁有的選項。

所以有效地你有MyClass的是:

Namespace ns3 

    Public Class myClass 
     Implements ns2.IDerived 
     Implements ns1.IParent 

     Public Function myFunction(ByRef obj as Object) As Double Implements ns2.IDerived.myFunction 

     End Function 

End ns3 

所以繼承的接口是真的只是一個執行,實施派生接口的類必須實現的基本接口方式。

+0

我太新來投票你的答覆,但我相信你是正確的。無論如何,編譯器似乎正在引導我。我可以在myClass中實現這兩個函數,並且只能調用我需要的函數。它只是沒有意義,爲什麼超載沒有奏效。謝謝回覆。 – llc381

+1

我做了一些更多的搜索,雖然這是在C#我認爲它解釋它比我更好一點。 http://haacked.com/archive/2009/11/09/interface-inheritance-esoterica。aspx – Jay

+0

不一樣的問題:這裏的編譯器抱怨是合法的:該類聲明它遵守一個約定,該約定聲明類**必須**有兩個* myFunction *的重載,並且這在任何語言中都應該是true。奇怪的是VB.net不支持隱藏的事實,而C#支持它允許在子接口中重新定義以隱藏上面的內容,避免實現者在兩個方法具有相同語義的情況下實施兩種方法的負擔。 – Pragmateek