2010-10-15 39 views
6

Tôi có một lớp kế thừa từ X509Certificate2. Tôi muốn tài sản NotAfter ở UTC thay vì giờ địa phương. Tôi khá mới với C# và đã tự hỏi nếu những gì tôi có dưới đây là cách tốt nhất để làm điều đó?C#: ghi đè thuộc tính của lớp cha

internal class Certificate : X509Certificate2 
{ 
    public new DateTime NotAfter 
    { 
     get { return base.NotAfter.ToUniversalTime(); } 
    } 

EDIT Khi tôi thay đổi nó như thế này:

public override DateTime NotAfter 
{ 
    get { return base.NotAfter.ToUniversalTime(); } 
} 

Resharper phàn nàn rằng "Không có bất động sản phù hợp cho ghi đè"

+0

Tại sao? Bạn đang cố làm gì vậy? – SLaks

+2

Có vấn đề gì khi thêm thuộc tính 'NotAfterUtc'? – LukeH

+0

Đồng ý với @LukeH - bạn đang cố gắng thay đổi hợp đồng (nghĩa) của một tài sản được định nghĩa trong lớp cơ sở. Đó là gần như không bao giờ là một ý tưởng tốt. Một tài sản riêng biệt có ý nghĩa hơn với tôi. –

Trả lời

9

Điều bạn đã làm là ẩn thành viên. Nếu lớp bạn đang bắt nguồn từ đã đánh dấu tài sản như virtual, hoặc là trọng nó từ cơ sở của nó (nếu nó có một) bạn sử dụng override keyword:

public override DateTime NotAfter 

Các ẩn thành viên có thể được sử dụng khi các lớp cơ sở đã không đánh dấu nó là virtual, tuy nhiên nếu có ai đó tham chiếu lớp học của bạn vào lớp cơ sở và truy cập thành viên, họ sẽ bỏ qua việc ẩn số new của bạn. Với thừa kế thực sự sử dụng override, vấn đề này không xảy ra.

Như đã ghi nhận của một ai đó, khách sạn này không được đánh dấu virtual:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2.notafter.aspx

Thành viên ẩn sẽ cho phép bạn làm được việc này nếu người sử dụng lớp học của bạn trực tiếp, nhưng thời điểm một người nào đó phôi lớp học của bạn trở lại loại cơ sở, chúng có giá trị cơ bản:

class MyClass : Cert... 

MyClass c = new MyClass(); 
DateTime foo = c.NotAfter; // Your newly specified property. 

Cert cBase = (Cert)c; 
foo = cBase.NotAfter; // Oops, base value. Inheritance cures this, but only with virtual members. 
+0

Cảm ơn điều đó rất hữu ích. – FunLovinCoder

0

Không, bằng cách này bạn chỉ là ẩn tài sản với một cái mới.

Vui lòng sử dụng "ghi đè" thay vì "mới". Xem tại đây để biết chi tiết về từ khóa "mới" làm công cụ sửa đổi: http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

EDIT: Như được đề cập trong nhận xét bên dưới, thuộc tính trong X509Certificate2 không được đánh dấu là ảo, vì vậy không thể ghi đè trong trường hợp này.

+2

Nó không phải là 'ảo'. – SLaks

0

Phương thức/thuộc tính trong C# không ảo theo mặc định (như trong Java). Bạn có chắc chắn thuộc tính NotAfter của bạn được định nghĩa là ảo trong lớp cơ sở không?

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