Как работает скрытие метода в C #?
-
22-08-2019 - |
Вопрос
Почему следующая программа печатает
B
B
(как и должно быть)
public class A
{
public void Print()
{
Console.WriteLine("A");
}
}
public class B : A
{
public new void Print()
{
Console.WriteLine("B");
}
public void Print2()
{
Print();
}
}
class Program
{
static void Main(string[] args)
{
var b = new B();
b.Print();
b.Print2();
}
}
но если мы удалим ключевое слово 'public' в классе B следующим образом:
new void Print()
{
Console.WriteLine("B");
}
он начинает печатать
A
B
?
Решение
Когда вы удаляете public
модификатор доступа, вы удаляете любую возможность вызывать B's new Print()
метод из Main
функция, потому что теперь она по умолчанию равна private
.Он больше не доступен для Main.
Единственный оставшийся вариант - вернуться к методу, унаследованному от A, поскольку это единственная доступная реализация.Если бы вы вызвали Print() из другого метода B, вы бы получили реализацию B, потому что члены B увидели бы частную реализацию.
Другие советы
Ты создаешь Print
способ private
, так что единственный доступный Print
метод является унаследованным.
Внешне новый B.Print()-метод больше не виден, поэтому вызывается A.Print().
Однако внутри класса по-прежнему виден новый B.Print-метод, так что это тот, который вызывается методами того же класса.
когда вы удаляете ключевое слово public из класса b, новый метод print больше не доступен за пределами класса, и поэтому, когда вы выполняете b.print из вашей основной программы, это фактически вызывает общедоступный метод, доступный в A (потому что b наследует a, а a по-прежнему имеет Print как public)
Без ключевого слова public метод является закрытым, поэтому не может быть вызван Main().
Однако метод Print2() может вызывать его, поскольку он может видеть другие методы своего собственного класса, даже если они частные.