可能?您可以将任何的访问权限更改为任何其他吗?
答案 0 :(得分:15)
不可以,您可以在子类中使用私有方法隐藏公共成员,但不能覆盖具有子类中的私有成员的公共成员。而且,实际上,它不仅仅是公共/私人事物,这适用于缩小访问范围。
修订:通过隐藏更严格的访问权限 - 在这种情况下是私有访问 - 您将仍从基类或子类中查看基类成员引用,但是当从新的访问级别获得时,它将遵循新方法。
因此,通常,当您隐藏时,隐藏在其访问级别可见时优先。否则原始方法就是使用的方法。
public class BaseClass
{
public virtual void A() { }
public virtual void B() { }
}
public class SubClass
{
// COMPILER ERROR, can't override to be more restrictive access
private override void A() { }
// LEGAL, you can HIDE the base class method, but which is chosen
// depends on level accessed from
private new void B() { }
}
所以SubClass.B()
只有在可访问的基类方法时才会隐藏它们。也就是说,如果您在SubClass.B()
内拨打SubClass
,那么它将采用B()
的隐藏形式,但由于B()
是私有的,因此对于以外的类不可见本身,因此他们仍然看到BaseClass.B()
。
它的长短是:
1)您不能覆盖方法以限制更多(访问方式)。 2)您可以隐藏具有更严格限制的方法,但它只会在新的访问类型可见的情况下产生影响,否则基础代码就会显示。
public class BaseClass
{
public virtual void A() { }
public virtual void B() { }
}
public class SubClass : BaseClass
{
public virtual void A() { B(); }
// legal, you can do this and B() is now hidden internally in SubClass,
// but to outside world BaseClass's B() is still the one used.
private new void B() { }
}
// ...
SubClass sc = new SubClass();
BaseClass bc = new BaseClass();
// both of these call BaseClass.B() because we are outside of class and can't
// see the hide SubClass.B().
sc.B();
bc.B();
// this calls SubClass.A(), which WILL call SubClass.B() because the hide
// SubClass.B() is visible within SubClass, and thus the hide hides BaseClass.B()
// for any calls inside of SubClass.
sc.A();
答案 1 :(得分:3)
不。
解决这个问题的一种典型方法是抛出NotImplementedException
或类似的东西。
答案 2 :(得分:2)
您无法缩小或扩大覆盖成员的可见性。但是,您可以使用new
关键字定义另一个方法,该方法可以为您提供具有相同名称的新方法,但在多态方面不兼容。
public class A : B
{
public new void Foo()
{
base.Foo();
}
}