我有一个抽象的基类,它上面有一个属性,我想防止隐藏,也就是新的,并覆盖。
public abstract class DomainObject
{
public bool IsDeleted { get; set; }
}
public class BankAccount : DomainObject
{
public bool IsDeleted { get; set; }
}
问题是:我需要BankAccount从基础DomainObject类继承,所以我不能将其标记为密封,但我想在编译时防止IsDeleted的情况,一个覆盖或新的。
答案 0 :(得分:11)
在这种情况下,IsDeleted
不是虚拟的,因此无法覆盖。通常,虽然您可以通过不首先使属性成为虚拟或通过在属性上指定sealed
修饰符来防止进一步覆盖来阻止覆盖大小写
public sealed override IsDeleted { get; set; }
但是,您无法通过new
阻止隐藏。除了完全阻止子类型之外,没有办法阻止子类型在现有属性上使用new
答案 1 :(得分:2)
为什么需要这样的功能?不可能既不阻止属性也不能防止方法隐藏在子类中。
答案 2 :(得分:2)
由于您在评论中提到的相同原因,我有同样的需求:防止生成的代码导致的问题。我的解决方案是将此特定警告设为错误,这可以通过将“0108”添加到“项目属性”=>来完成。 “Build”=> “将警告视为错误”=> “特定警告”清单。
我很想知道为什么这被认为只是一个警告,而不是一开始就是错误。当然,这是一些我认为没有考虑过的“脆弱的基类”......
答案 3 :(得分:0)
如何将祖先添加到DomainObject,其中IsDeleted将被标记为虚拟,之后在DomainObject中您可以将其标记为密封覆盖?