【问题标题】:How to prevent hide or override on a public property如何防止隐藏或覆盖公共财产
【发布时间】:2010-08-24 15:35:55
【问题描述】:

我有一个抽象基类,它上面有一个属性,我想防止隐藏、又名新的和覆盖。

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

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

问题是:我需要 BankAccount 从基础 DomainObject 类继承,所以我不能将其标记为密封,但我想防止在编译时出现 IsDeleted 的覆盖或新情况。

【问题讨论】:

  • 有没有可能添加一个属性来防止隐藏?
  • 我也有同样的需求,原因与您在 cmets 中提到的相同:防止由生成的代码引起的问题。我的解决方案是使这个特定警告成为错误,这可以通过将“0108”添加到“项目属性”=>“构建”=>“将警告视为错误”=>“特定警告”列表来完成。
  • @Mark 这听起来像是一个解决方案,你应该把它作为答案!

标签: c# inheritance oop compiler-errors


【解决方案1】:

在这种情况下,IsDeleted 不是虚拟的,因此无法覆盖。一般来说,尽管您可以通过首先不使属性虚拟化或通过在属性上指定 sealed 修饰符来防止进一步覆盖来防止覆盖情况

public sealed override IsDeleted { get; set; }

但是,您无法通过new 阻止隐藏。除了完全阻止子类型之外,没有办法阻止子类型在现有属性上使用new

【讨论】:

  • 感谢您的回复,我也试过了,但是它不会编译并抛出“找不到合适的方法来覆盖”
  • @Lucas B,那是因为您的情况下的财产根本不是虚拟的。我提供了一个示例,说明在 IsDelete 是虚拟的情况下如何防止覆盖
  • 好吧,我从来不知道“密封”可以在那种情况下使用。
  • 它没有被标记为虚拟,因为我想防止覆盖。我尝试使用公共虚拟布尔 IsDeleted 创建更多级别的基类 DomainObjectBase,然后将 DomainObject 的签名更改为公共密封覆盖 IsDeleted,但这只会阻止覆盖而不是隐藏。
  • @Lucas B 你无法阻止隐藏,这在 C# 中是不可能的
【解决方案2】:

出于与您在 cmets 中提到的相同原因,我也有同样的需求:防止由生成的代码引起的问题。我的解决方案是将此特定警告设为错误,这可以通过将“0108”添加到“项目属性”=>“构建”=>“将警告视为错误”=>“特定警告”列表来完成。

我很想知道为什么这首先被认为只是一个警告而不是一个错误。当然,这是我没有考虑过的一些“脆弱的基类”情况......

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 同意。尝试在抽象类中使用密封属性听起来是个坏主意。除非我错过了什么。
    • 我们正在使用一些代码生成工具来创建所有从基类继承的域对象。一些成员字段在所有成员中都是相同的,因此我们为这些字段创建了一个接口,用于对这些对象进行通用操作。因此,如果在代码生成过程中无意添加了一个字段,我们希望在编译过程中暴露该问题。幸运的是,它确实会生成警告,但我们不想将构建设置为因警告而失败...
    • 如果我能很好地理解您,那么根据您的需要,隐藏属性没有任何问题。由于您使用的是接口,因此将在您的应用程序中使用正确的方法属性 - 在实现接口的超类中定义的属性。
    【解决方案4】:

    如何将祖先添加到 IsDeleted 将被标记为虚拟的 DomainObject,然后在 DomainObject 中您将能够将其标记为密封覆盖?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 2020-12-17
      • 2018-07-18
      • 1970-01-01
      • 2011-03-13
      • 2019-02-14
      • 1970-01-01
      相关资源
      最近更新 更多