Доступ к тому же экземпляру класса в другой форме

Я уверен, что это простой вопрос, но у меня недостаточно опыта, чтобы знать ответ. :)

DataClass, Form1, Form2

У меня есть публичный класс DataClass в отдельном файле DataClass.vb. В DataClass у меня есть данные, хранящиеся в нескольких массивах, к которым мне нужно получить доступ. У меня есть методы в DataClass, чтобы я мог получить доступ к данным. Один из них GetName. На Form1 все работает нормально. Мне нужно получить доступ к тем же данным в массивах в другой форме, но мне нужно вызвать новый экземпляр класса, поэтому, когда я вызываю методы для доступа к массивам, данные пусты.

Я видел, как в некоторых темах упоминалось о создании singleton class, но большинство из них касалось C#, с которым я не так хорошо знаком.

Какова наилучшая практика?


person Brady    schedule 19.01.2013    source источник
comment
Вы создаете экземпляр Form2 из кода, работающего внутри Form1?   -  person Steve    schedule 20.01.2013
comment
Методы xfx будут работать для вас, но я бы посоветовал вам прочитать несколько руководств/книг по ООП. Потому что тогда вы получите более глубокое понимание того, что значит создавать новый объект, передавать объекты через параметры, иметь ассоциации от объекта к другим и так далее.   -  person Desty    schedule 20.01.2013
comment
@Steve - Да, но просто вызвав имя формы и .Show()   -  person Brady    schedule 20.01.2013
comment
@Desty - Спасибо за совет, я думаю, мне следует больше узнать об ООП, чтобы лучше понять.   -  person Brady    schedule 20.01.2013


Ответы (2)


Есть много способов сделать это. Один из них будет включать создание Module, а затем создание переменной, которая создает экземпляр вашего класса Public внутри модуля:

Module MyGlobalVariables
    Public MyDataClass As DataClass
End Module

Теперь все формы в вашем проекте смогут получить доступ к DataClass через MyGlobalVariables.MyDataClass.


Предпочтительным методом было бы добавить свойство в вашу форму Form2, которое можно установить для экземпляра DataClass:

Public Property MyDataClass As DataClass

Затем вы должны создать экземпляр Form2 следующим образом (при условии, что переменная, которую вы используете для создания экземпляра DataClass в Form1, называется _dataClass):

Dim frm2 As New Form2()
frm2.MyDataClass = _dataClass
frm2.Show()

И, наконец, другим способом было бы переопределить конструктор Form2 и разрешить ему получать параметр типа DataClass. Затем вы можете создать экземпляр Form2 как:

Dim frm2 As New Form2(_dataClass)

Надеюсь это поможет...

person xfx    schedule 19.01.2013
comment
Второй метод, который вы предоставили, является идеальным решением для моего приложения. Благодарю вас! - person Brady; 20.01.2013

Вы можете создать одноэлементный класс, подобный этому

Public Class DataClass
    Public Shared ReadOnly Instance As New DataClass()

    Private Sub New()
    End Sub

    ' Other members here
End Class

Вы можете получить доступ к одному экземпляру через общий элемент Instance, который инициализируется автоматически. Конструктор New является приватным, чтобы запретить создание нового экземпляра вне класса.

Вы можете получить доступ к синглтону следующим образом

Dim data = DataClass.Instance

Но это невозможно

Dim data = new DataClass() 'NOT POSSIBLE!

Поскольку доступ к одноэлементному классу осуществляется через имя класса, вы можете легко получить к нему доступ из двух форм.

person Olivier Jacot-Descombes    schedule 20.01.2013