2009-01-19 37 views
8

Trong ứng dụng của tôi, tôi đang chạy cùng một biểu mẫu chiến thắng trong các ngữ cảnh khác nhau để kiểm soát khả năng hiển thị của các nút, gắn nhãn của trường văn bản và văn bản tiêu đề winform. Cách tôi quyết định làm điều này chỉ đơn giản bằng cách chuyển một chuỗi đến hàm tạo biểu mẫu và kiểm tra nó bằng một vài câu lệnh if mà lần lượt chứa các chỉnh sửa winform mong muốn.Cuộc gọi thành viên ảo trong hàm tạo

if (formContext == "add") 
{ 
    Text = "Add member"; 
} 
if (formContext == "edit") 
{ 
    Text = "Change role"; 
    userTextBox.Enabled = false; 
    searchButton.Visible = false; 
} 

Điều này hoạt động tốt, tuy nhiên từ khóa "Văn bản" có đường kẻ màu xanh dương được thêm bởi ReSharper với thông báo sau: Cuộc gọi thành viên Virit trong hàm tạo. Đây có phải là một vấn đề tiềm năng hay chỉ là một số loại tin nhắn ReSharper quá nhiệt tình.

Bất kỳ làm rõ hoặc đề xuất nào để cải thiện việc triển khai của tôi sẽ được đánh giá cao.

Trả lời

9

Cuộc gọi thành viên ảo trong ctor lớp cơ sở có thể khiến một số logic chạy trong phân lớp trước khi ctor của lớp con được gọi (và do đó trước khi đối tượng có cơ hội tự khởi tạo thành trạng thái nhất quán).

Đó chỉ là một lời nhắc nhở tốt để bạn biết bạn đang làm điều gì đó có khả năng gây ra một số hành vi bất ngờ khó chịu.

+0

Có ... đây là dọc theo dòng tôi đã suy nghĩ bản thân mình. Bất kỳ đề xuất nào về cách tôi có thể làm điều này tốt hơn. Tính ổn định là ưu tiên số một trong dự án này và tôi muốn tránh hành vi bất ngờ có thể xảy ra. – Sakkle

+0

Bạn có nghĩa là gợi ý bên cạnh việc không gọi các phương thức ảo trong ctor class cơ sở của bạn? Trong trường hợp này, bạn có thể sử dụng ràng buộc dữ liệu để gắn kết thuộc tính Văn bản của biểu mẫu với trường chuỗi trong lớp mô hình GUI, sau đó sẽ chứa logic cần thiết để quyết định thanh tiêu đề nên nói gì. – mookid8000

+0

Có ... tôi có thể, mặc dù tôi không biết bắt đầu từ đâu, và tôi đoán tôi sẽ phải làm tương tự cho nút và trường văn bản. – Sakkle

6

Ngoài các câu trả lời hiện có, cho các hình thức bạn có thể thêm một handler tải sự kiện:

Load += delegate 
{ 
    if (formContext == "add") 
    { 
     Text = "Add member"; 
    } 
    if (formContext == "edit") 
    { 
     Text = "Change role"; 
     userTextBox.Enabled = false; 
     searchkButton.Visible = false; 
    } 
}; 
+0

Điều này có vẻ như giải pháp dễ nhất và tốt nhất cho những gì tôi đang cố gắng hoàn thành, mà không cần phải viết lại nhiều mã. Có ... Tôi lười: P – Sakkle

0

tôi sẽ đề nghị viết lại bạn lớp như sau:

public partial class Form1 : Form 
{ 
    public enum FormContextMode 
    { 
     Add, 
     Edit 
    } 

    private FormContextMode m_mode = FormContextMode.Add; 

    public Form1(FormContextMode mode) 
    { 
     InitializeComponent(); 
     m_mode = mode; 
     Load += delegate { UpdateForm(); }; 
    } 

    private void UpdateForm() 
    { 
     if(m_mode == FormContextMode.Add) 
     { 
      Text = "Add member";  
     } 
     else if(m_mode == FormContextMode.Edit) 
     { 
      Text = "Change role"; 
      userTextBox.Enabled = false; 
      searchkButton.Visible = false; 
     } 
    } 
} 
+0

Ahaaa ... ngọt ngào :) – Sakkle

+0

Bạn không cần đăng ký sự kiện Tải riêng, chỉ cần ghi đè phương thức OnLoad. –

+0

Vâng, tôi đồng ý với Ilya - tốt hơn để quá tải phương pháp sau đó bạn sẽ không cần phải nhớ để hủy đăng ký khỏi sự kiện + (và đây là một tuyên bố ruột) có lẽ nhanh hơn. – ng5000

3

Chỉ cần niêm phong lớp học của bạn.

+0

Xin vui lòng xây dựng ... – Sakkle

+1

http://msdn.microsoft.com/en-us/library/88c54tsw(VS.71).aspx Một lớp niêm phong không thể được kế thừa, do đó không có khả năng của một lớp dẫn xuất ghi đè thành viên ảo. – ng5000

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