C#覆盖公共成员并将其设为私有

时间:2011-08-24 15:52:20

标签: c# .net override private public

可能?您可以将任何的访问权限更改为任何其他吗?

3 个答案:

答案 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();
    }
}
相关问题