Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2010, 15:36   #1
mike_tihomirov
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 58
По умолчанию Вопрос по модификаторам доступа.

Всем привет.
В обычных классах мы можем изменять модификаторы доступа
в методах наследников фактически произвольно.
Код:
namespace TempConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
    class A
    {
        protected void func(){Console.WriteLine("A");}
    }
    class B : A
    {
        public new void func(){Console.WriteLine("B");}
    }
    class C : A
    {
        private new void func(){Console.WriteLine("C");}
    }
}
Почему же в АБСТРАКТНОМ классе модификатор доступа override метода наследника должен быть одинаковым с модификатором доступа родителя?

Почему: error CS0621: 'TempConsoleApplication.C.func()': virtual or abstract members cannot be private
Ведь класс С не абстрактный.

Почему: error CS0507: 'TempConsoleApplication.B.func()': cannot change access modifiers when overriding 'protected' inherited member 'TempConsoleApplication.Abstr.func( )'

Код:
namespace TempConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {}
    }
    abstract class Abstr
    {
        protected abstract void func();
    }
    class B : Abstr
    {
        public override void func(){Console.WriteLine("B");}
    }
    class C : Abstr
    {
        private/*protected*/ override void func(){Console.WriteLine("C");}
    }
}
Не бывает глупых вопросов.
Глупец тот, кто не спрашивает.
mike_tihomirov вне форума Ответить с цитированием
Старый 23.11.2010, 18:04   #2
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

Потому что в первом случае эти func не имеют ничего общего, это совершенно разные функции разных классов, никак друг от друга не зависящие

оверрайд же заменяет именно ту самую функцию предка
m0nax вне форума Ответить с цитированием
Старый 23.11.2010, 23:07   #3
mike_tihomirov
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 58
По умолчанию

Цитата:
Сообщение от m0nax Посмотреть сообщение
Потому что в первом случае эти func не имеют ничего общего, это совершенно разные функции разных классов, никак друг от друга не зависящие

оверрайд же заменяет именно ту самую функцию предка
Спасибо Монах.
Да кажись сложилось в голове.
Я так думаю, смысл в том, что компилятор динамически
подставляет метод и для него это как бы один и тот же метод,
а реализация его не волнует, лишь бы семантика метода одна и та же была.
Как то так.
Не бывает глупых вопросов.
Глупец тот, кто не спрашивает.
mike_tihomirov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WI-FI: точка доступа StudentPolitech Компьютерное железо 7 21.11.2010 12:28
блокирование доступа Che Guevara PHP 2 18.10.2010 16:24
Ограничение доступа! Coller Операционные системы общие вопросы 1 14.08.2010 08:52
Получение доступа Ламер_001 C/C++ Сетевое программирование 0 20.01.2009 08:51
Вопрос по Менюшке ограничение прав доступа danswin Общие вопросы Delphi 17 03.10.2007 16:05