2011-12-01 19 views
7

Tôi gặp sự cố khi tạo một phụ có thể tạo đối tượng của một loại biến khi đang di chuyển. Dưới đây là ví dụ về những gì tôi đang cố gắng đạt được:Phụ để tạo đối tượng kiểu được truyền bởi người gọi trong VB.NET

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 

Tôi không thể làm việc đó. Tôi đã thực hiện một chút công bằng của nghiên cứu, và nhìn vào các loại chung chung, sự phản ánh, và các công cụ khác, nhưng tôi đang gặp khó khăn khi xác định cách tốt nhất để giải quyết vấn đề này.

+0

Cân nhắc sử dụng Generics thay vì 'Type', nếu có thể. Bạn đang cố gắng để thực hiện? – SLaks

Trả lời

7

Bạn đang tìm kiếm Activator.CreateInstance(systemType)

+0

Điều này có thể xử lý một hàm tạo không? Tôi đã chỉnh sửa bài đăng gốc của mình để cho thấy rằng New có 2 đối số, một sự kiện mà tôi đã bỏ qua để hiển thị ban đầu. – Michael

+0

Có một tình trạng quá tải phải mất một mảng các đối tượng cho các tham số hàm tạo. 'Activator.CreateInstance (SomeType, New Object() {Param1, Param2})' –

2

Sử dụng Generics cho việc này:

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

Và gọi nó với:

createSystem(Of windSystem) 

Để giải thích:

Thuật ngữ Of T cho phép bạn tạo một phương thức có thể được sử dụng cho bất kỳ loại nào . Mỗi khi bạn gọi nó cho một giá trị mới của T, một phương pháp mới được tạo ra trong bộ nhớ.

Cụm từ As {New, systemSettings} ràng buộc T. Nó nói rằng T phải đại diện cho một loại đó là hoặc có nguồn gốc từ systemSettings. Nó cũng nói rằng T phải chứa hàm tạo mặc định: New() là bắt buộc đối với lệnh New T. Lưu ý rằng bạn không thể chỉ định một hàm tạo phức tạp hơn như một ràng buộc generics.

Nếu bạn yêu cầu tham số trong hàm tạo của mình, bạn có thể tạo phương thức Initialise trong lớp cơ sở. Bởi vì T bị giới hạn ở systemSettings, nó được đảm bảo rằng phương pháp Initialise tồn tại.

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

Vì vậy, nếu tôi hiểu chính xác phương pháp này về cơ bản tạo ra một phương pháp kế thừa bản gốc, nhưng sửa đổi các loại thông số? Điều này là thú vị, tuy nhiên tôi bị bỏ quên để hiển thị trong bài viết ban đầu của tôi rằng mới có hai đối số, và có vẻ như từ tuyên bố cuối cùng của bạn giải pháp này sẽ không hoạt động. – Michael

+0

Đúng vậy. Xem câu trả lời của tôi cho một giải pháp cho vấn đề mới của bạn. –

Các vấn đề liên quan