仅从VB.NET中的其他类实例化对象

时间:2014-10-02 14:59:06

标签: vb.net class instantiation

我有2个A和B类(在VB.NET中)。

我希望创建B类对象的唯一方法是使用A的方法。

示例:

你可以这样做:

Dim objectA as new A
Dim objectB as B = objectA.getAobject()

但你无法做到:

Dim objectB as new B

谢谢!

编辑:在“你可以做”部分我想说“Dim objectB as B = objectA.getAobject()”

3 个答案:

答案 0 :(得分:0)

您可以在B中创建一个私有构造函数:

Private Sub New()

End Sub

如果没有公共构造函数,这将阻止您在B本身内的任何地方编写这样的代码:

Dim objectB as new B

但是,需要您在B中的某处编写代码,否则您将无法在任何地方创建B 的实例。通常,共享方法是执行此操作的地方:

Friend Shared Function Create() As B
    '...
    Return New B
End Function

请注意Friend访问修饰符。现在,如果你有一个只包含A和B的程序集(类库项目),那么只有该程序集中的代码(只有A和B)才能使用该函数。在A中添加一个如下所示的方法:

Public Shared Function getObject() As B
   Return B.Create()
End Function

我们已经达到了你所说的所有目标。引用此程序集的代码将能够执行此操作:

Dim objectB as B = A.getAobject()

但是无法做到以下任何一种:

Dim objectB as new B
Dim objectB As B = B.Create()

答案 1 :(得分:0)

创建类库类型的新项目,并为A类和B类添加与此类似的代码

Public Class A
    Public Function getObject() As B
        Return New B()
    End Function
End Class

Public Class B

    Protected Friend Sub New()
        Console.WriteLine("Constructor B called")
        Console.ReadLine()
    End Sub
End Class

现在,B类的构造函数只能从该项目中存在的内部代码中调用,而不能从其他程序集中调用

在您的主项目中,您需要添加对此新项目的引用并导入其命名空间。

Module Module1

    Sub Main()
        Dim a1 = New A()
        ' Dim b1 = New B() 'This will not compile at all'
        Dim b2 = a1.getObject()
    End Sub

End Module

当然,现在你必须分发两个文件而不是一个....

这个工作的关键是不同的程序集和应用于B类构造函数的关键字Protected Friend

答案 2 :(得分:0)

如果您的调用类是A类型

,您可以检查B的构造函数
Class B 
    Sub New ()
        ' get parent frame and calling method
        Dim frame As StackFrame = new StackFrame( 1, True )
        Dim method As MethodBase = frame.GetMethod()

        ' for debug purposes
        Dim methodName As String = method.DeclaringType.Name & "->" & method.Name
        Console.WriteLine(methodName)

        ' throw exception
        If (method.DeclaringType.Equals(typeof(A)) = False) {
            throw new Exception("Not called from class A!!")
        End If
    End Sub
End Class