Возможные? Можете ли вы изменить доступ ко всему чему-либо еще?
С# переопределить открытый элемент и сделать его приватным
Ответ 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();
}
}