我有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()”
答案 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