С# переопределить открытый элемент и сделать его приватным

Возможные? Можете ли вы изменить доступ ко всему чему-либо еще?

Ответ 1

Нет, вы можете скрыть открытый элемент с приватным методом в подклассе, но вы не можете переопределить публичный элемент с закрытым в подклассе. И, фактически, это не просто публичная/частная вещь, это относится к сужению доступа в целом.

Пересмотренный. Скрываясь с более ограничительным доступом - в этом случае с закрытым доступом - вы по-прежнему будете видеть члена базового класса из ссылки базового класса или подкласса, но он будет отложить до новый метод, доступный с нового уровня доступа.

Таким образом, в общем случае, когда вы скрываете, у шва есть преимущество, когда оно видимо на уровне доступа. В противном случае используется оригинальный метод.

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() { }
}

So SubClass.B() ТОЛЬКО скрывает методы базового класса, когда он доступен. То есть, если вы вызываете SubClass.B() внутри SubClass, тогда он примет скрытую форму B(), но поскольку B() является закрытым, он не виден классам вне себя, и поэтому они STILL видят 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 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();

Ответ 2

Неа.

Типичным способом борьбы с этим является выброс NotImplementedException или что-то в этом роде.

Ответ 3

Вы не можете сузить или расширить видимость члена, переопределенного. Однако вы можете определить другой метод с ключевым словом new, который может дать вам новый метод с тем же именем, но который несовместим с точки зрения полиморфизма.

public class A : B
{
    public new void Foo()
    {
        base.Foo();
    }
}