首页 文章

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

提问于
浏览
0

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

我想要创建B类对象的唯一方法是使用A的方法 .

Examples:

You could do:

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

BUT you couldn´t do:

Dim objectB as new B

谢谢!

编辑:在“你可以做”部分我想要“昏暗的对象B为B = objectA.getAobject()”

3 回答

  • 0

    创建一个类型为 Class Library 的新项目,并为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

  • 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
    
  • 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()
    

相关问题