2012-09-30 28 views
8

Tôi đã đọc một hướng dẫn về việc chủ yếu tùy chỉnh, và tôi đã gặp phải mã:gì được bảo vệ ảo mới

public class BaseController : Controller 
{ 
    protected virtual new UserPrincipal User 
    { 
     get { return HttpContext.User as UserPrincipal; } 
    } 
} 

Làm thế nào chính xác được "bảo vệ ảo mới" làm việc?

Từ khóa "mới" là điều làm tôi khó hiểu nhất.

+0

Nó được đề cập trong tài liệu: http://msdn.microsoft.com/en-us/library/435f1dw2.aspx phải luôn là cổng gọi đầu tiên của bạn –

Trả lời

21

protected có nghĩa là chỉ hiển thị trong lớp này và các lớp bắt nguồn từ lớp này.

virtual có nghĩa là nó có thể được ghi đè lên trong các lớp dẫn xuất.

new có nghĩa là ở đây bạn tạo phân cấp ghi đè mới, tức là bạn dừng ghi đè phương thức được xác định trong lớp cơ sở và thay thế phương thức này bằng phương pháp này.

Thông tin chi tiết có thể được tìm thấy here

+0

Và hầu hết thời gian đó là ý tưởng tồi giới thiệu một thành viên 'mới' của một lớp, ẩn một thành viên đã có (được kế thừa từ một lớp cơ sở). Tại sao không chỉ chọn một tên khác (hơn 'Người dùng') cho thuộc tính, một cái không xung đột với một thành viên đã có? –

+0

Vâng, nó là loại vô nghĩa để có Controller.User đã từ lớp cơ sở và Controller.CustomUser. Tôi thích điều này với mới, nó làm cho mã của tôi sạch sẽ. Cảm ơn Zdeslav đã giải thích chi tiết. –

6

new được sử dụng để ẩn thành viên.

Không giống như phương pháp ghi đè, phương thức new sẽ không được gọi bằng tham chiếu đến lớp cơ sở.

Xem documentation.

3

câu hỏi quan trọng của bạn: "Từ khoá new là những gì confuses me nhiều nhất."

Câu trả lời ngắn:newoverride không loại trừ lẫn nhau. new được sử dụng để thay thế thành viên lớp được thừa kế từ một lớp cơ sở. Ngược lại, override được sử dụng để mở rộng việc triển khai lớp cơ sở của một thành viên.

Từ new Modifier (C# Reference)(Visual Studio 2013):

Đây là một lỗi sử dụng cả hai mớioverride trên thành viên cùng, vì hai từ bổ nghĩa có ý nghĩa loại trừ lẫn nhau. mới công cụ sửa đổi mới tạo thành viên mới có cùng tên và khiến thành viên gốc bị ẩn. Ghi đè ghi đè mở rộng việc triển khai cho thành viên được kế thừa.

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