Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 派生类中的抽象方法重写,如何使私有_C#_Oop_Overriding_Private_Abstract Methods - Fatal编程技术网

C# 派生类中的抽象方法重写,如何使私有

C# 派生类中的抽象方法重写,如何使私有,c#,oop,overriding,private,abstract-methods,C#,Oop,Overriding,Private,Abstract Methods,嗨,我有一个类“a”作为抽象方法 protected abstract List<Contributor> GetContributors(List<SyndicationPerson> contributersList); 受保护的抽象列表GetContributors(列表contributersList); 我想用以下条件重写派生类“B”中的此方法 它应该是B班的私人物品 编译器不允许我在派生类“B”中将此方法声明为私有 正确的语法是什么?您不能。这将违反类

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

protected abstract List<Contributor> GetContributors(List<SyndicationPerson> contributersList);
受保护的抽象列表GetContributors(列表contributersList);
我想用以下条件重写派生类“B”中的此方法

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

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

您可以将主实现设置为私有,然后创建一个只调用私有方法的受保护方法(如果您真的愿意)

当这个方法被设计成可以从一个数据库调用时,为什么首先要将它设置为私有的呢

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

请注意,这还将防止进一步的派生类进一步“重写”,这可能是可取的,也可能是不可取的


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

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

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

为什么要这样做?谢谢Jon,明白了,我想我还没有把自己说清楚。我希望类“B”中被重写的方法“getContractors”可以在类“B”中调用,可以从基类“A”调用,但不能进一步继承,不能在继承的类中调用,比如说“C”,不能像其他公共方法一样使用另一个类的对象调用。您能告诉我们使用这种语法的含义吗。不过,它进行了编译,似乎满足了前面描述的一些要求。---受保护的密封覆盖列表GetContributors(列表贡献者列表----非常感谢jon,拯救了我的一天。请注意,这是覆盖,而不是重载。(当然,重载时您实际上可以降低可见性:)感谢您的更正,我总是以某种方式犯了这个错误。:)