@Kinhagen

Upcast: Доступ к методам базового класса с различными модификаторами доступа из производного класса после Upcast?

Здраствуйте. Не знаю, как код вставить, но вот вопрос на примере:
Есть базовый класс с допустим методами:

class X
{... поля/свойства...

public int Aaa();
protected int Bbb();
private int Ccc();
...}

И есть дочерний класс в котором произведён upcast (также пару методов для примера) :

class Y : X
{... поля/свойства...

public string Sss();
protected string Www();
private string Ttt();
...
Y петя = new Y();
X мужчина = петя; // upcast
}

Вопросы:
1. Теряет ли петя, ставший мужчиной, все свои методы Sss, Www, Ttt? (даже public Sss?)
2. К каким методам родительского класса имеет петя, ставший мужчиной, доступ? Т.е. что разрешено: мужчина.Ааа()? мужчина.Bbb()? мужчина.Ccc()? (здесь особенно интересует protected Bbb, т.к. мужчина.Bbb() у меня выдает ошибку)
Спасибо.
  • Вопрос задан
  • 438 просмотров
Решения вопроса 1
AnarchyMob
@AnarchyMob
public методы можно вызывать через каст:
if (мужчина is Y y)
{
    y.Sss();
}

или
((Y) мужчина).Sss();
или
(мужчина as Y)?.Sss();
Доступ к защищенным (protected) методам разрешен только внутри самого класса (если к модификатору protected добавить internal доступ расширяется до уровня сборки), приватные методы не виртуальные, они не наследуются.

P.S. Ну и идентификаторы у вас...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
GavriKos
@GavriKos
С петей не произойдет ровным счетом ничего - он остается инстансом класса Y, которому доступны и свои методы, и методы родителя.
Но получить к ним доступ через переменную "мужчина" без приведения к типу Y вы не сможете.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы