c# - 派生类中的抽象方法覆盖,如何使私有(private)

标签 c# oop overriding private abstract-methods

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

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

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

  • 它应该是B类私有(private)的。

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

最佳答案

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

您可以将主要实现设为私有(private),然后创建一个只调用私有(private)方法的 protected 方法,如果您真的愿意的话。

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

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

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

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

关于c# - 派生类中的抽象方法覆盖,如何使私有(private),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1816399/

相关文章:

c# - 使用 LINQ 大写对象列表

c# - 实现 IEnumerable<T> 时遇到问题

java - 使用 OOP 的多个着色器、对象和 Material

javascript - Typescript - "this"关键字错误

c++ - 我可以在 C++ 中覆盖非虚函数吗

c# - WaitForExit() 抛出异常 c#

当外部类中的属性更改时 C# 引发事件

java - Java中 "IS -A"关系和 "HAS-A"关系有什么区别?

Java Set 集合 - 覆盖 equals 方法

ios - 覆盖我的自定义 UIView 子类的初始化程序