Derived类中的抽象方法覆盖,如何使私有

时间:2009-11-29 18:54:33

标签: c# oop override private abstract-methods

嗨,我有一个“A”类作为抽象方法

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

我想在具有以下条件的派生类“B”中覆盖此方法

  • 它应该是B级私人的。

编译器不允许我在派生类“B”中将此方法声明为私有 什么是正确的语法?

3 个答案:

答案 0 :(得分:8)

你做不到。这将违反A类中声明的可访问级别。除此之外,它将阻止它被A类调用!如果A类中的代码试图调用您以某种方式用私有实现覆盖的抽象方法,您会发生什么?

您可以将主要实现设为私有,然后创建一个受保护的方法,如果您真的想要,则只调用私有方法。

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

编辑:好的,现在你已经在评论中解释了你想做什么,你不能这样做。最接近的是将委托传递给A的构造函数 - 该委托可以引用私有方法。不幸的是,当你在构造函数链中传递参数时,你不能使用“this”,所以你不得不做一些可怕的事情,例如编写一个 static 方法,它将“this”作为它的第一个参数,有效...除了它必须将它转换为正确的类型,因为父母不能声明它应该是什么类型。然后父母将调用委托而不是受保护的方法。

请注意,这也会阻止进一步的派生类进一步“覆盖”,这可能是也可能不是。

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

相关问题