2014-10-02 7 views
0

У меня есть 2 класса A и B (в VB.NET).экземпляр объекта ТОЛЬКО из другого класса в VB.NET

Я хочу единственный способ создать объект класса B был с помощью mehtod А.

Примеры:

Вы можете сделать:

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

НО вы не могли:

Dim objectB as new B 

Спасибо!

Edit: в "Вы можете сделать" раздел Я хочу означать "Dim objectB, как B = objectA.getAobject()"

+0

Почему бы не просто пойти Dim objectB = A.getAobject()? Вы должны будете стесняться, хотя это может быть и не очень хорошо. – Kat

+1

Единственный способ добиться этого - разместить класс 'A' внутри класса' B' и позволить классу 'B' иметь частный конструктор. –

ответ

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

Создайте новый проект типа Class Library и добавить код аналогично этому для класса а и класса 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 может быть вызвана только из внутреннего кода, присутствующего в этом Proje ct не из других сборок

В вашем основном проекте вам необходимо добавить ссылку на этот новый проект и импортировать его пространство имен.

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 

Конечно, теперь вам нужно распространять два файла вместо одного.

Ключа для этого работу различных сборок и ключевое слово Protected Friend применительно к конструктору класса B

0

Вы можете просто проверить в конструкторе B, если ваш класс призвания типа A

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 
Смежные вопросы