C#:覆盖父类的属性

时间:2010-10-15 15:55:26

标签: c# inheritance properties

我有一个继承自X509Certificate2的类。我希望NotAfter属性是UTC而不是本地时间。我对C#很陌生,并且想知道我下面的内容是否是最好的方法呢?

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

修改 当我把它更改为:

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

Resharper抱怨“没有合适的财产可以覆盖”

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

不,这样你只是用一个新的隐藏属性。

请使用“覆盖”而不是“新”。有关“new”关键字作为修饰符的详细信息,请参阅此处:http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

编辑:正如下面的评论中所提到的,X509Certificate2中的属性未标记为虚拟,因此在这种情况下无法覆盖它。

答案 2 :(得分:0)

默认情况下,C#中的方法/属性不是虚拟的(就像它们在Java中一样)。您确定您的NotAfter属性在基类中被定义为虚拟吗?