嗨,我有一个带有抽象方法的类“A”
protected abstract List<Contributor> GetContributors(List<SyndicationPerson> contributersList);
我想用以下条件在派生类“B”中覆盖这个方法
- 它应该是 B 类私有的。
编译器不允许我在派生类“B”中将此方法声明为私有什么是正确的语法?
嗨,我有一个带有抽象方法的类“A”
protected abstract List<Contributor> GetContributors(List<SyndicationPerson> contributersList);
我想用以下条件在派生类“B”中覆盖这个方法
编译器不允许我在派生类“B”中将此方法声明为私有什么是正确的语法?
你不能。这将违反 A 类中声明的可访问性级别。除此之外,它会阻止它被 A 类调用!如果类 A 中的代码尝试调用您以某种方式被私有实现覆盖的抽象方法,您会期望发生什么?
您可以将主要实现设为私有,然后创建一个仅调用私有方法的受保护方法,如果您真的愿意的话。
当它被设计为可从 A 调用时,为什么要首先将方法设为私有?
编辑:好的,现在你已经在评论中解释了你想做什么,你不能这样做。最接近的方法是将委托传递给 A 的构造函数——该委托可以引用私有方法。不幸的是,当你在构造函数链中传递参数时,你不能使用“this”,所以你不得不做一些可怕的事情,比如编写一个将“this”作为第一个参数的静态方法,有效地......除了它也必须将其转换为正确的类型,因为父级无法声明它应该是哪种类型。然后父级将调用委托而不是受保护的方法。
请注意,这也会阻止进一步的派生类进一步“覆盖”,这可能是可取的,也可能不是可取的。
这是令人难以置信的曲折,我会尽量避免它。如果您真的担心派生类可能会做什么,我会尝试密封类并强迫人们使用组合而不是继承。该语言并不能真正帮助您在这里做您想做的事。
作为一般的 OOPS 规则,在覆盖时不能降低成员的可见性。所以从受保护到私有是不允许的。
您不能在 C# 中更改虚拟方法的访问级别。您可以使用new
关键字重新声明它,但这是隐藏先前方法的重新声明,因此如果您正在处理声明类型和实际类型不同的对象,或者如果您经常将对象转换为基类类型。