嗨,我有一个带有抽象方法的“A”类

protected abstract List<Contributor> GetContributors(List<SyndicationPerson> contributersList);

我想用以下条件重写派生类“B”中的此方法

  • 它应该是 B 级私有的。

编译器不允许我将此方法声明为“ b”类中的私有语法?

有帮助吗?

解决方案

你不能。这将违反 A 类中声明的可访问性级别。除了其他任何事情之外,它还会阻止 A 类调用它!如果类 A 中的代码尝试调用您以某种方式用私有实现覆盖的抽象方法,您会期望发生什么?

如果您确实愿意,可以将主要实现设为私有,然后创建一个仅调用私有方法的受保护方法。

当该方法被设计为可从 A 调用时,为什么首先要将该方法设为私有?

编辑:好吧,现在你已经在评论中解释了你想做什么,但你做不到。最接近的方法是将委托传递给 A 的构造函数 - 该委托可以引用私有方法。不幸的是,当你在构造函数链中传递参数时,你不能使用“this”,所以你被迫做一些可怕的事情,比如写一个 静止的 方法将“this”作为其第一个参数,实际上......但它也必须将其转换为正确的类型,因为父级无法声明它应该是哪种类型。然后,父级将调用委托而不是受保护的方法。

请注意,这还会阻止进一步的派生类进一步“重写”,这可能是也可能不是所需的。

这是非常曲折的,我会尽可能避免它。如果您真的担心派生类可能会做什么,我会尝试密封该类并强制人们使用组合而不是继承。该语言并不能真正帮助您完成您想做的事情。

其他提示

作为一般的 OOPS 规则,在覆盖时不能降低成员的可见性。所以从受保护到私有是不允许的。

您无法更改 C# 中虚拟方法的访问级别。您可以使用以下命令重新声明它 new 关键字,但这是隐藏前一个方法的重新声明,因此,如果您正在处理声明类型和实际类型不同的对象,或者如果您经常将对象强制转换为基类类型,则它将无法按您的预期工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top