การเข้าถึงอินสแตนซ์เดียวกันของคลาสในรูปแบบอื่น

ฉันแน่ใจว่านี่เป็นคำถามง่ายๆ แต่ฉันไม่มีประสบการณ์เพียงพอที่จะรู้คำตอบ :)

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 จะใช้ได้ผลสำหรับคุณ แต่ฉันขอแนะนำให้คุณอ่านบทช่วยสอน/หนังสือ OOP บางเล่ม เพราะจากนั้น คุณจะได้รับข้อมูลเชิงลึกที่ลึกซึ้งยิ่งขึ้นว่าการสร้างวัตถุใหม่หมายความว่าอย่างไร การส่งผ่านวัตถุไปมาผ่านพารามิเตอร์ การเชื่อมโยงจากวัตถุหนึ่งไปยังอีกวัตถุหนึ่ง และอื่นๆ   -  person Desty    schedule 20.01.2013
comment
@Steve - ใช่ แต่เพียงแค่เรียกชื่อแบบฟอร์มและ .Show()   -  person Brady    schedule 20.01.2013
comment
@Desty - ขอบคุณสำหรับคำแนะนำ ฉันคิดว่าฉันควรเรียนรู้เพิ่มเติมเกี่ยวกับ OOP เพื่อทำความเข้าใจให้ดีขึ้น   -  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 ที่ใช้ร่วมกัน ซึ่งจะเริ่มต้นโดยอัตโนมัติ Constructor New เป็นแบบส่วนตัวเพื่อห้ามไม่ให้สร้างอินสแตนซ์ใหม่จากภายนอกคลาส

คุณสามารถเข้าถึงซิงเกิลตันเช่นนี้

Dim data = DataClass.Instance

แต่นี่เป็นไปไม่ได้

Dim data = new DataClass() 'NOT POSSIBLE!

เนื่องจากคลาสซิงเกิลตันเข้าถึงได้ผ่านชื่อคลาส คุณจึงสามารถเข้าถึงได้จากทั้งสองแบบฟอร์มได้อย่างง่ายดาย

person Olivier Jacot-Descombes    schedule 20.01.2013