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

Posted

技术标签:

【中文标题】派生类中的抽象方法覆盖,如何使私有【英文标题】:abstract method override in Derived class, how to make private 【发布时间】:2010-12-21 10:40:43 【问题描述】:

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

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

我想在派生类“B”中用以下条件覆盖这个方法

它应该是 B 类私有的。

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

【问题讨论】:

你为什么要这样做? 【参考方案1】:

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

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

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

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

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

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

【讨论】:

谢谢乔恩,明白了,我想我还没有说清楚。我希望类“B”中的覆盖方法“GetContributors”可在类“B”内调用,可从基类“A”调用,但不能进一步继承,不能在继承类中调用,例如“C”,不能通过使用调用像其他公共方法一样的另一个类的对象你能说出使用这种语法的含义吗?它可以编译,并且似乎满足了前面描述的一些要求。 ----- 受保护的密封覆盖 List GetContributors(List 贡献者列表---- 感谢乔恩,拯救了我的一天。【参考方案2】:

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

【讨论】:

请注意,这是覆盖,而不是重载。 (你实际上可以在重载时降低可见性,当然 :) 感谢您的更正,不知何故我总是会犯这个错误。 :)【参考方案3】:

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

【讨论】:

以上是关于派生类中的抽象方法覆盖,如何使私有的主要内容,如果未能解决你的问题,请参考以下文章

Scala 中的特征和抽象方法覆盖

为啥基类指针指向基类中的纯虚方法,而不是派生类中的覆盖方法?

如何实现基类的虚方法,并在c#中的覆盖方法中获取基方法实现[重复]

什么是抽象类什么是接口两者有什么区别?如何使用它(转载)

覆盖Java中的私有方法

绑定与非绑定方法 继承 继承与抽象 查找属性关系 派生与覆盖 访问父类的内容