2010-08-01 33 views
20

VB6 sınıf modüller parametreli kurucular yok. Bunun için hangi çözümü seçtiniz? Facory yöntemlerini kullanmak bariz bir seçim gibi görünüyor, ama beni şaşırtmak!VB6'daki müteahhitlik eksikliğiyle nasıl baş ettiniz?

+8

Kurucular eksikliği IMO demek için iyi bir yol değildir. VB6 * gerçekten de parametresiz yapıcılara sahiptir ('Class_Initialize' yöntemi). Sahip olmadığı şey parametreli kurucular. –

+0

@Mehrdad: nokta alındı! – Dabblernl

cevap

6

Ben genellikle aynı modülde (.BAS uzantısı) deki ilgili sınıflar için "kurucular" koymak fabrika yöntemleri sopa. Ne yazık ki, bu, VB6'daki normal nesne oluşturmaya erişimi gerçekten sınırlayamadığınızdan, optimal olmaktan çok uzaktır - sadece nesnelerinizi fabrikada yaratmanın bir noktasını yapmak zorundasınız. Daha kötü yapan şey, gerçek nesne ile fabrika yönteminiz arasında zıplamak zorunda kalmaktır, çünkü IDE'deki organizasyonun kendisi en iyi şekilde hantaldır.

+0

Ya da fabrika yöntemini sınıfa eklemenin ne demek? Fabrika modüllerini bir modülde koymak, uygulamaya özel hale getirir. – Dabblernl

+0

@Dabblernl - Ama sonra onları Java'nın 'public static' değerine denk getirmek zorundasın, değil mi? VB6'nın statik yöntemleri yoktur. – derekerdmann

+0

Eh, statik bir sınıfa gerek yok. Fabrika yöntemine erişmek için bir örnek oluşturmanız gerekir, ancak nesnenin bağımlılıklarını kullanamayacağınız için IMHO – Dabblernl

5

Kullanılabilir sınıf başlatıcısı nasıl kullanılır? Bu parametresiz yapıcı gibi davranır:

Private Sub Class_Initialize() 
    ' do initialization here 

End Sub 
+2

Hiçbir parametreyi kabul etmemesi, bir kurucu olarak işe yaramaz hale getirir. Gerçekten sadece birkaç şey ayarlamanıza izin verir, ancak nesnenin durumunu gerçekten başlatmaz. – derekerdmann

+0

Üzgünüm, sorumu belirsizdi. Problemi sadece parametresiz bir kurucunun nasıl çözüleceğini kastediyorum: Class_Initialize – Dabblernl

4

Daha sonra, bir nesnenin örneğini oluşturan ve bir Friend Init() yöntemini arayarak fabrika işlevlerinin bir karışımını (üst sınıflarda) kullanıyorum.

Sınıf CObjects:

Public Function Add(ByVal Param1 As String, ByVal Param2 As Long) As CObject 
    Dim Obj As CObject 
    Set Obj = New CObject 
    Obj.Init Param1, Param2 
    Set Add = Obj 
End Function 

Sınıf CObject:

Friend Sub Init(ByVal Param1 As String, ByVal Param2 As Long) 
    If Param1 = "" Then Err.Raise 123, , "Param1 not set" 
    If Param2 < 0 Or Param2 > 15 Then Err.Raise 124, , "Param2 out of range" 

    'Init object state here 
End Sub 

Ben Friend kapsam projede herhangi bir etkisi olmayacağını biliyorum, ama bu iç için olduğunu bir uyarı görevi görür sadece kullan. Bu nesneler COM üzerinden ortaya çıkarsa, Init yöntemi çağrılmaz ve sınıfı PublicNotCreatablestops it being created olarak ayarlar.

İlgili konular