Скрыть унаследованные свойства на классе / интерфейсе? - PullRequest
0 голосов
/ 16 июля 2011

Мне было интересно, есть ли способ скрыть унаследованные свойства для подтипов в C #, например, например:

public interface ISupplierLogin : ISupplier
{
    [Obsolete]
    new string BusinessName { get; set; }

    [Obsolete]
    new long ABN { get; set; }

    [Obsolete]
    new DateTime DateRegistered { get; set; }
}

public interface ISupplier
{
    bool TradeOnly { get; set; }

    [Required]
    [DisplayName("Business Name")]
    [StringLength(25, ErrorMessage = "The maximum length of business name is 25 characters.")]
    [DataType(DataType.Text)]
    string BusinessName { get; set; }

    [Required]
    [DisplayName("Australian Business Number")]
    [ABNValidator(ErrorMessage="The ABN you entered does not appear to be valid.")]
    long ABN { get; set; }

    [Required]
    [RegularExpression("^[a-zA-Z0-9]+$", ErrorMessage="The username you entered does not appear to be valid. (a-z & 0-9)")]
    [StringLength(25, ErrorMessage = "The maximum length of username is 25 characters")]
    [DataType(DataType.Text)]
    string Username { get; set; }

    [Required]
    [StringLength(12, ErrorMessage = "The maximum length of password must be between 8 and 12 characters long.")]
    [DataType(DataType.Password)]
    string Password { get; set; }

    [DisplayName("Date Registered")]
    DateTime DateRegistered { get; set; }
}

Где я хочу унаследовать свои атрибуты проверки в моей модели представления, нотолько для двух свойств.

Можно ли как-то добиться того, что я пытаюсь сделать аккуратно?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 16 июля 2011

Вы неправильно интерпретируете идею наследования: в основном, когда у вас есть два класса A и B, а B является расширением A, B будет наследовать все не-приватные элементы A;это ничем не отличается, если вы использовали взаимодействие и класс, два интерфейса и т. д.

Поэтому, по моему мнению, вы должны использовать только наследование , если вы реализуете все поля иначе вы как бы побеждаете цель наследования и не следуете объектно-ориентированным принципам.

Что вы можете сделать, однако (не лучший вариант, но это возможно)is use:

thow new NotImplementedException();

Это показывает конечному программисту, что он / она не может использовать это свойство, поскольку его или ее приложение сгенерирует исключение на этапе отладки.

Аналогичновы можете использовать [Obsolete(..., true)], что заставит компилятор выдавать ошибку при компиляции; примечание второй параметр установлен на true. Также , вы можете использовать [Browsable(false)], чтобы скрыть его в IntelliSense, но это все еще позволит использовать это свойство.


Вы можете добавить это свойство, которое будет эффективноотключить большинство видов использования вашей собственности.Он будет не на самом деле скрывать его в том смысле, в каком вы хотите, но он показывает, что разработчик игнорирует его.

[Bindable(false)]
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

Что касается фактического сокрытия, я не думаю, чтодля этого есть возможность.

1 голос
/ 16 июля 2011

Я полагаю, что этот предыдущий вопрос даст вам ответы, которые вы ищете.

Как скрыть унаследованное свойство в классе без изменения унаследованного класса (базового класса)?

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