Вопрос

Почему следующая программа печатает

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() может вызывать его, поскольку он может видеть другие методы своего собственного класса, даже если они частные.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top