为什么在覆盖C#中的方法时不能更改访问修饰符?
在C#中,当从基类覆盖方法时,我们无法更改访问修饰符。例如
Class Base{
**protected** string foo()
{
return "Base";
}
}
Class Derived : Base
{
**public** override string foo()
{
return "Derived";
}
}
在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
选项已满足您的要求。
我希望这可以使它更清楚。
以上是 为什么在覆盖C#中的方法时不能更改访问修饰符? 的全部内容, 来源链接: utcz.com/qa/430062.html