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() у меня выдает ошибку)
Спасибо.
или ((Y) мужчина).Sss();
или (мужчина as Y)?.Sss();
Доступ к защищенным (protected) методам разрешен только внутри самого класса (если к модификатору protected добавить internal доступ расширяется до уровня сборки), приватные методы не виртуальные, они не наследуются.
Да, я вчера еще всякие комбинации попробовала и так себе и записала, что protected после upcast как private становится. Ну, а то, что он себя после downcast опять "нормально" ведёт, это мне понятно было.
P.S. нормальные идентификаторы..
Что думаю, то пишу :D
С петей не произойдет ровным счетом ничего - он остается инстансом класса Y, которому доступны и свои методы, и методы родителя.
Но получить к ним доступ через переменную "мужчина" без приведения к типу Y вы не сможете.
Так в этом всё и дело. Если мужчину проверить на GetType, то выдаёт, что он петя. Понятно.
Но, тогда (поскольку петя есть экземпляр дочернего класса Y) вызов protected метода Bbb (мужчина.Bbb() ) должен работать по идеи, так же как работает петя.Bbb(). Нет?
Ну хорошо, допустим мужчина забыл, что он петя.. Но тогда присвоенный ему на время тип X, разве не дает ему полномочий вызывать protected методы Х?
Protected у меня на мужчине не работает больше. Не могу понять логику, запуталась. :(
Kinhagen, protected метод нельзя вызвать извне любого класса. Т.е. хоть мужчина.Bbb(), хоть петя.Bbb() работать не будут. Только изнутри самого класса.
GavriKos, но он же наследник. Разве наследники не имеют доступ к protected методам родителя? Bbb() - protected метод класса X, а объект петя - член класса Y, который в свою очередь является ребёнком X.
У меня петя.Bbb(); работает. А вот если петю на переменную мужчина сослать, то все protected методы родительского класса для этой переменной становятся как бы private и на мужчине не работают.
Наверное это какое-то правило upcast для protected методов. Но конкретной инфы об этом я пока не нашла.
Буду дальше экспериментировать.