2011-07-14 10 views
1

VB.Netで間違っていることを誰かに知っていますか?VB.Net継承とインターフェイス

Module Module1 

Interface ISearch(Of T As ISearchResult) 
    Function ids() As List(Of T) 
End Interface 

Interface ISearchResult 
    Function id() As String 
End Interface 

MustInherit Class BasicSearch(Of T As ISearchResult) 
    Implements ISearch(Of T) 

    MustOverride Function ids() As System.Collections.Generic.List(Of T) Implements ISearch(Of T).ids 

End Class 

Class Search 
    Inherits BasicSearch(Of SearchResult) 
    Implements ISearch(Of SearchResult) 


    Overrides Function ids() As System.Collections.Generic.List(Of SearchResult) 
     Return New List(Of SearchResult) 
    End Function 
End Class 

Class SearchResult 
    Implements ISearchResult 
    Public Function id() As String Implements ISearchResult.id 
     Return "id" 
    End Function 
End Class 

Sub Main() 

    Dim foo As New Search() 
    Dim bar As Object = foo 
    Dim foobar As ISearch(Of ISearchResult) = foo 

End Sub 

End Module 

3番目のキャストは機能しません。 なぜですか?

私はoopレッスンを見逃しましたか? ISearch(Of SearchResult)ISearch(Of ISearchResult)ない

おかげ

答えて

1

は - 彼らは異なるジェネリック型パラメータを持っています。 SearchISearch(Of SearchResult)です。


はブライアンの答えは、私は後でこの質問に追加する計画だろうと、.NET 4のための共分散など、ものをカバーして(私はすぐに最初の答えを書いた後、オフラインで行っていた - 私が得た時間でバック、ブライアンが答えていた)


回答してください。 - MOESコメントはISearchは別の方法があった場合を想像:

Sub AddID(ID as T) 

を、私たちは、その後Searchのそれを実装すると仮定すると(これは、覚えているので、TSearchResultで、ISearch(Of SearchResult)です)。あなたのキャストが働いていた場合

Public Class BadNews 
    Implements ISearchResult 

    Public Function id() As String Implements ISearchResult.id 
     Return "other" 
    Function 
End Class 

今、私たちは今、呼び出すことができます:そして、私たちはISearchResultを実装して何かを持っていたと仮定言う

foobar.AddID(New BadNews) 

しかし、これは動作しないことができる - AddIDの実装をその私たちはSearchによって実装されているものを呼び出しており、その関数はタイプSearchResultのオブジェクトを受け取ることを予期しています。 foobarISearch(Of ISearchResult)fooに互換性がないと暗黙変換演算子が存在しないISearch(Of SearchResultあるため

+0

ですが、「ISearchResultを実装しているため」SearchResultがISearchResultとして表示されませんか? –

+0

@mr。 moe - 私はどのように間違っているのかの例を追加しようとしました。 –

+0

これはすごく助かりましたが、今は私のアーキテクチャを変更する必要があります:D –

1

キャストは動作しません。

.NET 4.0では、この問題をエレガントに解決するために使用できる共変および反変一般的な型パラメータの概念が導入されました。 VB 10でコードをコンパイルしようとすると、このエラーが発生します。

エラーBC36757: 'Module1.Searchは' '(Module1.ISearchResultの)Module1.ISearch' に変換することはできません。 'Interface ISearch(Of T As Module1.ISearchResult)'の定義で 'T' をOut型のパラメータ 'Out T'に変更することを検討してください。あなたはTが新しいOutキーワードを使用してISearchResultに共変であることを示すことができるの勧告に従い

Interface ISearch(Of Out T As ISearchResult) 
    Function ids() As List(Of T) 
End Interface 

残念ながら、このエラーが発生します。

エラー:BC36724:タイプ 'T'は 'T'が 'Out'タイプのパラメータ であるため、このコンテキストでは使用できません。

これは、List(Of T)自体が共変量ではないためです。ただし、IEnumerable(Of T)はです。だからこれは大丈夫だろう。

あなたは、その後、他の宣言の IEnumerable(Of T)から List(Of T)から同じ変更を加える必要があるでしょう
Interface ISearch(Of Out T As ISearchResult) 
    Function ids() As IEnumerable(Of T) 
End Interface 

+0

悲しいことに私はvb.net 3.5に縛られています –

関連する問題