2011-12-01 19 views
7

Anında bir değişken türünde nesneler oluşturabilen bir alt oluşturmakta sorun yaşıyorum. İşte elde etmeye çalıştığım şeylerin bir örneği:VB.NET'te arayan tarafından iletilen nesne türünü oluşturmak için Alt

class systemSettings 
    'some properties 
end class 

Class fireSystemSettings 
    inherits systemSettings 
    'some additional properties 
end class 

Class windSystemSettings 
    inherits systemSettings 
    'some additional properties 
end class 

sub createSystem(systemType as Type, arg1 as object, arg2 as object) 
    Dim newSystem as New systemType(arg1, arg2) 
    systemCollection.add(newSystem) 
end sub 

Çalışamam. Biraz araştırma yaptım ve genel türlere, yansımalara ve diğer araçlara baktım, ancak bu sorunun üstesinden gelmek için ne yapacağımı belirlerken sorun yaşıyorum.

Sub createSystem(Of T As {New, systemSettings})() 
    Dim newSystem As New T 
    systemCollection.add(newSystem) 
End Sub 

Ve ile diyoruz:

+0

Eğer yapabiliyorsanız, 'Type' yerine jenerikleri kullanmayı düşünün. Neyi başarmaya çalışıyorsun? – SLaks

cevap

7

Bunun için Activator.CreateInstance(systemType)

+0

Bu bir kurucuyu işleyebilir mi? Orijinal yazımı Yeni'nin 2 argümanını, orijinal olarak göstermeyi ihmal ettiğim bir gerçek olduğunu göstermesi için düzenledim. – Michael

+0

Kurucu paramları için bir dizi nesne alan bir aşırı yükleme var. 'Activator.CreateInstance (SomeType, Yeni Nesne() {Param1, Param2})' –

2

Kullanım jenerik aradığınız

createSystem(Of windSystem) 

açıklamak için:

vadeli Of T yapmanızı sağlayan herhangi bir tip için kullanılabilecek bir yöntem oluşturmak . Her yeni T değeri için çağırdığınızda, bellekte yeni bir yöntem oluşturulur.

As {New, systemSettings} terimi T'u kısıtlar. T'nin, systemSettings'dan türeyen veya türeyen bir türü temsil etmesi gerektiğini söylüyor. Ayrıca T'un New T komutu için gerekli olan varsayılan kurucu: New() içermesi gerektiğini de söylüyor. Jenerik kısıtı olarak daha ayrıntılı bir kurucu belirleyemeyeceğinizi unutmayın.

Yapıcınızdaki parametrelere gereksiniminiz varsa, temel sınıfta bir Initialise yöntemi oluşturabilirsiniz. T, systemSettings için kısıtlandığından, Initialise yönteminin mevcut olduğu garanti edilir.

Class systemSettings 
    Public Overridable Sub Initialise(arg1 As Object, arg2 As Object) 
     'initialise properties 
    End Sub 
    'some properties 
End class 

Class fireSystemSettings 
    Inherits systemSettings 
    Public Overrides Sub Initialise(arg1 As Object, arg2 As Object) 
     'initialise properties 
    End Sub 
    'some additional properties 
End Class 

Class windSystemSettings 
    Inherits systemSettings 
    Public Overrides Sub Initialise(arg1 As Object, arg2 As Object) 
     'initialise properties 
    End Sub 
    'some additional properties 
End Class 

Sub createSystem(Of T As {New, systemSettings})(arg1 As Object, arg2 As Object) 
    Dim newSystem As New T 
    newSystem.Initialise(arg1, arg2) 
    systemCollection.add(newSystem) 
End Sub 
+0

Bu nedenle, doğru bir şekilde anladığımda, bu yöntem esas olarak orijinali miras alan ancak parametre türünü değiştiren başka bir yöntem oluşturur? Bu ilginç, ancak orijinal yazımda yeni argümanları aldığımı göstermeyi ihmal ettim ve son ifadenizden bu çözüm işe yaramayacak gibi görünüyor. – Michael

+0

Bu doğru. Yeni sorununun çözümü için cevabımı görün. –

İlgili konular