代码之家  ›  专栏  ›  技术社区  ›  Lucas B

如何防止对公共财产隐藏或覆盖

  •  3
  • Lucas B  · 技术社区  · 14 年前

    我有一个抽象基类,它上面有一个属性,我想防止同时隐藏(也叫new)和重写。

    public abstract class DomainObject
    {
        public bool IsDeleted { get; set; }
    }
    
    public class BankAccount : DomainObject
    {
        public bool IsDeleted { get; set; }
    }
    

    问题是:我需要BankAccount从基DomainObject类继承,因此我不能将其标记为sealed,但我希望防止在编译时删除isDeleted的情况、重写或新情况。

    4 回复  |  直到 8 年前
        1
  •  2
  •   MarkPflug    8 年前

    我有同样的需求,原因和您在注释中提到的一样:防止由生成的代码引起的问题。我的解决方案是将此特定警告设置为一个错误,可以通过将“0108”添加到“项目属性”=>“内部版本”=>“将警告视为错误”=>“特定警告”列表中来完成。

    我很好奇为什么这仅仅是一个警告,而不是一个错误。当然,这是一些“脆弱的基础阶级”的情况,我没有考虑到…

        2
  •  11
  •   JaredPar    14 年前

    在这种情况下 IsDeleted 不是虚拟的,因此不可能进行重写。一般来说,您可以通过不首先使属性为虚拟的,或者通过指定 sealed 属性的修饰符

    public sealed override IsDeleted { get; set; }
    

    但是你不能阻止通过 new . 无法阻止子类型使用 新的 在现有属性上,而不是完全阻止子类型

        3
  •  2
  •   Petr Kozelek    14 年前

    你为什么需要这样的功能?不能防止属性和方法都隐藏在子类中。

        4
  •  0
  •   TechCrap    11 年前

    将祖先添加到DomainObject,其中isDeleted将被标记为“虚拟”,然后在DomainObject中,您可以将其标记为“密封覆盖”?