隐藏类/接口上的继承属性?

时间:2011-07-16 13:43:40

标签: c# .net inheritance .net-4.0 interface

我想知道是否有办法在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 个答案:

答案 0 :(得分:4)

你误解了继承的想法:基本上当你有两个类AB时,BA的一个范围,B继承 A的所有非私有元素;如果你使用的是interace和一个类,两个接口等,那就没有什么不同了。

因此,在我看来,如果你实现所有字段,你应该只使用继承,否则你会破坏继承的目的而你不会遵循面向对象原理

可以做什么但是(不是最好的选择,但有可能)是使用:

thow new NotImplementedException();

这向最终程序员展示他/她不能使用此属性,因为他或她的应用程序将在调试阶段抛出异常。

类似地,您可以使用[Obsolete(..., true)],这将使编译器在编译时抛出错误; note 第二个参数设置为true同样,您可以使用[Browsable(false)]在IntelliSense中隐藏它,但这仍然允许使用此属性。


您可以将此添加到属性,这将有效地禁用您的属性的大多数用法。 实际上会隐藏它你想要的意义,但它确实显示开发人员忽略它。

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

实际隐藏它的时候,我认为没有可能。

答案 1 :(得分:1)