C# 如何防止在公共属性上隐藏或重写

C# 如何防止在公共属性上隐藏或重写,c#,inheritance,oop,compiler-errors,C#,Inheritance,Oop,Compiler Errors,我有一个抽象基类,它有一个属性,我想防止隐藏(也称为new)和重写 public abstract class DomainObject { public bool IsDeleted { get; set; } } public class BankAccount : DomainObject { public bool IsDeleted { get; set; } } 问题是:我需要BankAccount从基本DomainObject类继承,因此我无法将其标记为密封,但

我有一个抽象基类,它有一个属性,我想防止隐藏(也称为new)和重写

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

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

问题是:我需要BankAccount从基本DomainObject类继承,因此我无法将其标记为密封,但我想防止在编译时出现IsDeleted重写或新建的情况。

在这种情况下,
IsDeleted
不是虚拟的,因此无法进行重写。但通常,您可以通过首先不将属性设置为虚拟,或者通过在属性上指定
sealed
修饰符来防止进一步的重写,从而防止重写情况

public sealed override IsDeleted { get; set; }

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

为什么需要此功能?不可能阻止属性和方法隐藏在子类中。

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


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

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

感谢您的回答,我也尝试过,但是,它不会编译并抛出一个错误“找不到可重写的合适方法“@Lucas B,那是因为你的财产根本不是虚拟的。我提供了一个示例,说明如何在IsDelete是virtualWell的情况下防止重写。我从来不知道“sealed”可以在该上下文中使用。它没有标记为virtual,因为我想防止重写。我尝试创建一个更高级别的基类,DomainObjectBase和一个公共虚拟bool IsDeleted,然后将DomainObject的签名更改为public sealed override IsDeleted,但这只会阻止重写而不是隐藏。@Lucas B你不能阻止隐藏,这在C中是不可能的,同意。试图在抽象类中使用密封属性听起来是个坏主意。除非我遗漏了什么。我们正在使用一些代码生成工具来创建从基类继承的域对象。一些成员字段在所有成员中都是相同的,因此我们为这些字段创建了一个接口,用于对这些对象进行常规操作。因此,如果在代码生成期间无意中添加了字段,我们希望在编译期间暴露问题。幸运的是,它确实生成了一个警告,但我们不想将构建设置为在警告时失败……如果我很了解您,那么对于您的需要,隐藏属性没有什么错。由于您使用的是接口,因此将在应用程序中使用正确的方法属性,即在实现接口的超类中定义的属性。是否有可能添加一个属性来防止隐藏?我有同样的需求,原因与您在注释中提到的相同:防止由生成的代码。我的解决方案是将此特定警告设置为错误,这可以通过将“0108”添加到“项目属性”=>“构建”=>“将警告视为错误”=>“特定警告”列表中来实现。@标记这听起来像一个解决方案,您应该将其作为答案!