为什么在覆盖C#中的方法时不能更改访问修饰符?

为什么在覆盖C#中的方法时不能更改访问修饰符?,第1张

为什么在覆盖C#中的方法时不能更改访问修饰符?

派生类型中更改方法的访问修饰符是没有意义的,这就是为什么不允许这样做的原因:

情况1:使用更严格的访问权限覆盖

由于以下情况,显然不允许这种情况:

class base{    public virtual void A() {}}class Derived: base{    protected override void A()}

现在我们可以说:

List<base> list;list.Add(new Derived());list[0].A() //Runtime access exception

情况2:使用限制较少的访问修饰符覆盖

有什么意义?隐藏该方法即可完成。显然,如果有人通过基本类型进行调用,那么他们将无法访问派生类型中定义的新方法,但这与基本类型的作者希望事物成为现实的方式保持一致,因此您无权“更改”。如果要从派生类中调用派生类的细节,在这种情况下,该

new
方法可以很好地工作。

编辑: 扩展案例2

在案例2中,我想说的是,如果您想更改可访问性,则您已经可以更改任何方法(虚拟或非虚拟)的可访问性。

考虑以下代码:

public class base{    protected virtual string WhoAmI()    {        return "base";    }}public class Derived : base{    public new virtual string WhoAmI()    {        return "Derived";    }}public class AnotherDerived : Derived{    public override string WhoAmI()    {        return "AnotherDerived";    }}

使用

new
关键字,您已经有效地为您的
Derived
类创建了一个具有相同名称和签名的新虚拟方法。请注意,允许声明一个
new
方法
virtual
,因此任何派生自该类的类
Derived
都将被覆盖。

不允许别人做以下事情:

 base newbaseObject = new Derived(); newbaseObject.WhoAmI() //WhoAmI is not accessible.

但是,这个事实与是否可以覆盖

WhoAmI()
无关。无论如何,这种情况永远不会因为
base
没有声明
public
WhoAmI()

因此,在理论上

Derived.WhoAmI()
可以覆盖的C#中
base.WhoAmI()
,这样做没有任何实际好处,因为无论如何您将永远无法从基类中调用虚拟方法,因此该
new
选项已满足您的要求。

我希望这可以使它更清楚。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5440848.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存