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
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
3 回答
创建一个类型为 Class Library 的新项目,并为A类和B类添加与此类似的代码
现在,只能从此项目中存在的内部代码中调用类B的构造函数,而不能从其他程序集中调用
在您的主项目中,您需要添加对此新项目的引用并导入其命名空间 .
当然现在你必须分发两个文件而不是一个....
这项工作的关键是不同的程序集和应用于B类构造函数的关键字Protected Friend
如果你的调用类是A类,你可以检查B的构造函数
你可以在B中创建一个私有构造函数:
如果没有公共构造函数,这将阻止您在任何地方编写代码,但在B本身内:
但是,这需要您在B中的某处编写代码,否则您将无法在任何地方创建B实例 . 通常,共享方法是执行此操作的地方:
请注意
Friend
访问修饰符 . 现在,如果你有一个只包含A和B的程序集(类库项目),那么只有该程序集内的代码(只有A和B)才能使用该函数 . 在A中添加一个如下所示的方法:我们已经实现了您所有的既定目标 . 引用此程序集的代码将能够执行此操作:
但是无法做到以下任何一种: