2010-10-15 235 views
6

我有一個繼承自X509Certificate2的類。我希望NotAfter屬性使用UTC而不是本地時間。我對C#很陌生,想知道下面是我做的最好的方法嗎?C#:覆蓋父類的屬性

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

編輯 當我把它改成這樣:

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

ReSharper的抱怨說,「沒有了覆蓋合適的物業」

+0

爲什麼?你想做什麼? – SLaks 2010-10-15 15:59:12

+2

添加'NotAfterUtc'屬性會出現什麼問題? – LukeH 2010-10-15 16:00:37

+0

同意@LukeH - 您試圖更改基類中定義的屬性的合同(含義)。這幾乎不是一個好主意。一個單獨的屬性對我來說更有意義。 – 2010-10-15 16:02:08

回答

9

你在那裏做的是會員隱藏。如果你是從派生類具有顯着的財產virtual,或者是從它的基本覆蓋它(如果有的話),你使用override關鍵字:

public override DateTime NotAfter 

成員隱藏時,可以使用的基類沒有標記virtual,但是如果有人將你的課程引用到基類並訪問了成員,他們會繞過你的隱藏new。如果使用override進行真正的繼承,則不會發生此問題。

正如已經有人指出,這個屬性是沒有標記virtual

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

成員藏身將讓你來解決這個問題,如果人們直接使用你的類,但一旦有人蒙上你的類回到基本類型,他們得到的基值:

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

非常感謝您的幫助。 – FunLovinCoder 2010-10-15 16:56:23

0

沒有,這樣你只是躲在財產與一個新的。

請使用「覆蓋」而不是「新」。關於作爲修飾符的「新」關鍵字的詳細信息,請參閱此處:http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

編輯:正如在下面的註釋中提到的,X509Certificate2中的屬性未標記爲虛擬,因此在此情況下重寫它是不可能的。

+2

它不是'虛擬'的。 – SLaks 2010-10-15 15:58:38

0

方法/ C#中的屬性是不是虛擬的默認(就像他們在Java)。你確定你的NotAfter屬性在基類中被定義爲虛擬的嗎?