2016-04-05 5 views
2

Angenommen, Basisklasse Foo implementiert IDisposable. Die Klassen FooA und FooB erben Klasse Foo. Eine einfache Factory-Methode, FooFactory.Create(), gibt entweder ein FooA- oder ein FooB-Objekt zurück, je nach den Anforderungen des Clients.Erstellen Sie Einweg-Objekt über Factory in Using-Anweisung

Im Client-Code (FooTest Modul), versucht, die Factory-Methode in einer verwenden ‚Mit‘ Aussage führt zu dem folgenden Compiler-Fehler:

‚Mit‘ Ressourcenvariable eine expliziten Initialisierung haben muss.

Ich würde mich über Vorschläge (Best Practices) bezüglich einer Implementierung freuen, die die Instanziierung von FooA oder FooB (vom Client angegeben) über die Using-Anweisung unterstützen würde. Eine Fabrik ist nicht erforderlich - es ist einfach der Ansatz, den ich ausprobiert habe. Im Idealfall möchte ich, dass FooA und FooB separate Klassen mit einer gemeinsamen Basisklasse oder Schnittstelle sind.

Vielen Dank im Voraus für Ihre Hilfe.

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 

Antwort

4

Sie haben nur die Syntax falsch in der Using-Zeile. Schreiben Sie es genauso wie die Dim, ersetzt Dim mit Verwendung:

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

Sie nicht „Als FooFactory.Create“ sagen können, da eine Art des „A“ Schlüsselwort folgen muß.

+0

Ugh. Danke Stuart. ... und entschuldige mich bei allen, die auf diesem Posten Zeit verloren haben. – mjr

Verwandte Themen