2016-04-05 8 views
2

基本クラスFooはIDisposableを実装するものとします。クラスFooAおよびFooBはFooクラスを継承します。単純なファクトリメソッドFooFactory.Create()は、クライアントのニーズに応じてFooAオブジェクトまたはFooBオブジェクトを返します。以下のコンパイルエラーに「を使用」ステートメントの結果にファクトリメソッドを使用しようとする以下のクライアントコード(FooTestモジュール)で 使い捨てオブジェクトの作成usingステートメント

、:

明示的な初期化を持っている必要がありますリソース変数「を使用して」

FooAまたはFooB(クライアントによって指定された)のインスタンス化をサポートする実装については、Usingステートメントを使用していただければ幸いです。ファクトリは必須ではありません。これは単に私が試したアプローチです。理想的には、FooAとFooBを共通の基本クラスまたはインタフェースを持つ別々のクラスにしたいと思います。

お手数ですがお寄せいただきありがとうございます。

Public Module FooTest 

    Public Sub Test() 
     'the following compiles: 
     Dim f As Foo = FooFactory.Create("A") 
     f.DoWork() 
     f.Dispose() 
     'the following causes a compile error: 
     ''Using' resource variable must have an explicit initialization. 
     Using f As FooFactory.Create("A") 
      f.DoWork() 
     End Using 
    End Sub 

End Module 

Public Module FooFactory 

    Public Function Create(ByVal AorB As String) As Foo 
     If AorB = "A" Then 
      Return New FooA 
     Else 
      Return New FooB 
     End If 
    End Function 

    Public Class FooA : Inherits Foo 
    End Class 

    Public Class FooB : Inherits Foo 
    End Class 

    Public MustInherit Class Foo : Implements IDisposable 
     Public Overridable Sub DoWork() 
     End Sub 
     Public Overridable Sub Dispose() Implements IDisposable.Dispose 
     End Sub 
    End Class 

End Module 

答えて

4

「使用する行」の構文が間違っています。それは使用して薄暗い置き換えて、ちょうど点心のように書く:

Using f As Foo = FooFactory.Create("A") 

タイプがキーワード「のように」従わなければならないので、あなたが「FooFactory.Create通り」と言うことはできません。

+0

Ugh。スチュアートに感謝します。このポストで時間を無駄にした人には謝罪します。 – mjr

関連する問題