Как работает метод скрытия в C #? - PullRequest
8 голосов
/ 02 апреля 2009

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

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

Ответы [ 5 ]

20 голосов
/ 02 апреля 2009

Когда вы удаляете модификатор доступа public, вы удаляете любую возможность вызывать метод B new Print() из функции Main, потому что теперь он по умолчанию равен private. Он больше не доступен для Main.

Единственным оставшимся вариантом является использование метода, унаследованного от A, поскольку это единственная доступная реализация. Если бы вы вызывали Print () из другого метода B, вы бы получили реализацию B, потому что члены B увидели бы частную реализацию.

5 голосов
/ 02 апреля 2009

Вы делаете метод Print private, поэтому единственный доступный метод Print - это наследственный.

3 голосов
/ 02 апреля 2009

Внешне новый метод B.Print () больше не виден, поэтому вызывается A.Print ().

Однако внутри класса новый B.Print-метод все еще виден, поэтому он вызывается методами того же класса.

2 голосов
/ 02 апреля 2009

когда вы удаляете ключевое слово public из класса b, новый метод печати больше не доступен вне класса, и поэтому, когда вы делаете b.print из своей основной программы, он фактически делает вызов публичного метода доступным в A (потому что b наследует a, а a все еще имеет Print как public)

1 голос
/ 02 апреля 2009

Без общедоступного ключевого слова метод является закрытым, поэтому Main () не может быть вызван.

Однако метод Print2 () может вызывать его так же, как и другие методы своего класса, даже если он частный.

...