2011-12-29 29 views
9

Tôi là một nhà phát triển C# và chưa có kinh nghiệm trong VB.NET.VB.NET - Gọi nhiều Constructors

kịch bản:

Namespace Presenters 
    Public Class BaseFooPresenter 

     ' assuming the public default parameterless constructor 

     Public Sub New(ByVal strvar As String) 
      ' TODO with strvar variabile 
     End Sub 

    End Class 

    Public Class FooPresenter 
      Inherits BaseFooPresenter 

     Public Sub New(ByVal boolvar As Boolean) 
      ' TODO with boolvar variabile 
     End Sub 

     Public Sub New(ByVal boolvar As Boolean, _ 
         ByVal objvar As Object) 
      MyBase.New(String.Empty) 
      Me.New(true) 
      ' TODO with objvar variabile 
     End Sub 

    End Class 
End Namespace 

Với mã này ở các nhà xây dựng FooPresenter thứ hai tôi nhận được một lỗi

"gọi Constructor chỉ có hiệu lực tại báo cáo kết quả đầu tiên trong một constructor dụ."

tại địa chỉ:

  Me.New(true) 

Nếu tôi đảo ngược thứ tự tôi nhận được lỗi tại địa chỉ:

  MyBase.New(String.Empty) 

tôi có thể tạo ra một phương pháp SetValues ​​(... các thông số ...) và gọi nó là từ hai nhà xây dựng nhưng không ai đó knwos một workaround để tránh lỗi này ?, Tại sao trình biên dịch không xác nhận khả năng để gọi các nhà xây dựng cơ bản trước khi xây dựng quá tải ?.

Có ai biết cách biện minh một cách hợp lý thực tế là không thể gọi hàm tạo lớp cơ sở và hàm tạo cấp lớp khác từ một hàm tạo cấp lớp cùng một lúc?

+0

xin lỗi @Moonlight vì tôi rất mới trong stackoverflow và tôi không có đủ điểm danh tiếng (lúc bây giờ 14) bỏ phiếu câu trả lời :( – manuellt

+3

bạn có thể đánh dấu câu trả lời cho câu hỏi của bạn (không phải biểu quyết mỏng, đánh dấu là câu trả lời) – Moonlight

+2

thanx @Moonlight cho aproach xây dựng của bạn, tôi đang đánh dấu câu trả lời ngay bây giờ;) – manuellt

Trả lời

16

Vấn đề là một khi bạn chỉ định một constructor tham số, các nhà xây dựng parameterless trở thành tin trừ khi rõ ràng quy định khác của bạn.

Vì vậy, thay đổi mã ken2K của:

Namespace Presenters 
    Public Class BaseFooPresenter 

     ' SPECIFYING the protected default parameterless constructor 
     ' can also be public 
     Protected Sub New() 

     End Sub 

     Public Sub New(ByVal strvar As String) 
      ' TODO with strvar variabile 
     End Sub 

    End Class 

    Public Class FooPresenter 
     Inherits BaseFooPresenter 

     Public Sub New(ByVal boolvar As Boolean) 
      MyBase.New() 
      ' TODO with boolvar variabile 
     End Sub 

     Public Sub New(ByVal boolvar As Boolean, _ 
         ByVal objvar As Object) 
      Me.New(boolvar) 
      ' TODO with objvar variabile 
     End Sub 

    End Class 
End Namespace 
+0

Xin chào @MA Hanin, tôi cần hàm khởi tạo FooPresenter đầu tiên để gọi hàm tạo cơ sở parameterless và hàm tạo FooPresenter thứ hai để gọi hàm tạo đầu tiên của FooPresenter trước/sau khi gọi hàm tạo cơ sở quá tải cơ bản, tôi thấy không thể. – manuellt

2

Bạn không thể gọi nhiều nhà thầu như vậy. Cũng giống như trong C# bạn chỉ có thể gọi một bộ khởi tạo.

4

Cũng giống như với C#, bạn không thể gọi this()base() cùng một lúc. Đây là những gì bạn nên làm:

Namespace Presenters 
    Public Class BaseFooPresenter 

     ' assuming the public default parameterless constructor 

     Public Sub New(ByVal strvar As String) 
      ' TODO with strvar variabile 
     End Sub 

    End Class 

    Public Class FooPresenter 
      Inherits BaseFooPresenter 

     Public Sub New(ByVal boolvar As Boolean) 
      MyBase.New(String.Empty) 
      ' TODO with boolvar variabile 
     End Sub 

     Public Sub New(ByVal boolvar As Boolean, _ 
         ByVal objvar As Object) 
      Me.New(boolvar) 
      ' TODO with objvar variabile 
     End Sub 

    End Class 
End Namespace 
+0

Hi @ ken2k, điều quan trọng là nhà xây dựng đầu tiên không gọi quá trình xây dựng lớp cơ sở quá tải, bắt buộc rằng hàm tạo đầu tiên gọi hàm tạo lớp cơ sở không tham số ngầm định, thanx trước. – manuellt

+1

@manuellt: 'bắt buộc rằng hàm tạo đầu tiên gọi hàm tạo lớp cơ sở không tham số tiềm ẩn' Tại sao? Có vẻ như bạn chỉ đang làm một cây gậy cho lưng của mình với yêu cầu này. –

+0

@Robin Brown, thanx cho quan sát của bạn, FooPresenter tiêu thụ một đối tượng được tạo trong lớp cơ sở nếu được xây dựng với tham số HOẶC một đối tượng tĩnh từ một ngăn xếp nếu được gọi với hàm tạo quá tải truyền cho nó một khóa đến lớp cơ sở. ereditates từ lớp cơ sở này và tôi chỉ muốn tìm cách ít tác động để thực hiện các hành vi mới tại một số lớp học hiện có và những cái mới. – manuellt