C #: переопределить свойство родительского класса - PullRequest
6 голосов
/ 15 октября 2010

У меня есть класс, который наследуется от 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(); }
}

Решарпер пожаловался, что "Нет подходящего свойства для переопределения"

Ответы [ 3 ]

9 голосов
/ 15 октября 2010

То, что вы сделали, это скрытие члена. Если класс, из которого вы производите, пометил свойство как 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 голосов
/ 15 октября 2010

Методы / свойства в C # не являются виртуальными по умолчанию (как в Java).Вы уверены, что ваше свойство NotAfter определено как виртуальное в базовом классе?

0 голосов
/ 15 октября 2010

Нет, таким образом, вы просто скрываете свойство с новым.

Пожалуйста, используйте «переопределить» вместо «новый». Подробнее о ключевом слове "new" в качестве модификатора см. Здесь: http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

РЕДАКТИРОВАТЬ: Как упомянуто в комментарии ниже, свойство в X509Certificate2 не помечено как виртуальное, поэтому в этом случае переопределение невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...