代码之家  ›  专栏  ›  技术社区  ›  Catskul

向接口添加属性是否会阻止在派生类型中创建私有/受保护的“集”?

  •  18
  • Catskul  · 技术社区  · 15 年前

    编辑: 原来我漏掉了一些明显的东西,但我要把这个问题留着,以防别人犯同样明显的错误。感谢那些指出这一点的人 请参阅下面的解释。

    也许我遇到了一个愚蠢的时刻,但在我看来,在接口中定义一个属性隐含地要求派生类不能为该属性提供任何非公共集。

    例子:

    interface IField
    {
        bool IsValid { get; }
    }
    

    ... 由于接口属性可能没有可访问性修饰符,这意味着:

    class Field : IField
    {
        public override bool IsValid { get; protected set; }
    }
    

    …将不可能,尽管它满足接口要求 .

    IMO这对可能通过非公共属性进行的封装有很大的负面影响,并阻止了一些常见的属性使用模式。

    我知道您可以创建一个非公共的SetIsValid成员来修改一个公共的后备存储,但是这会创建一个不一致的模式,并且如果不需要的话,会增加代码噪声。


    编辑:是的

    我现在正在修改其他人的代码,只是意识到我正在处理的类实现了接口并派生自基类。我是新来的c#这就是造成超控混乱的原因。

    实际的类看起来像:

    class Field : IField, BaseField
    {
        public override bool IsValid { get; protected set; }
    }
    

    2 回复  |  直到 15 年前
        1
  •  37
  •   BFree    15 年前

    这是完全合法的。您不需要override关键字(实际上它不会编译),但是没有什么可以阻止您这样做:

    interface IField
    {
        bool IsValid { get; }
    }
    
    class Field : IField
    {
        public bool IsValid { get; protected set; }
    }
    
        2
  •  6
  •   Mark Seemann    15 年前

    它是 可能在接口上 ,但是 属性-你可能把这两个混淆了。