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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2010, 18:08   #1
mike_tihomirov
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 58
По умолчанию Почему модификатор доступа в интерфейсе должен быть public?

Натолкнулся на одном тест-сайте на вопрос:

Почему модификатор доступа в методе интерфейса
и в соответствующем методе в классе наследнике должен быть public?
А не к примеру protected, private.


Ну с private итак понятно, смысл теряется, а действительно
почему разработчики запретили protected, ведь в абстрактных
классах protected допустим даже если метод не имеет реализации.

код примера такой:

Код:
interface ISome
    {
        void Print();
    }
    abstract class Abs
    {
        abstract protected void Print2();
        virtual protected void Print3(){}
    }
    class Program
    {
        static void Main(){}
    }
    class A: Abs, ISome
    {
        protected override void Print2() { }
        protected override void Print3() { }

        public void Print() { }
    }
Не бывает глупых вопросов.
Глупец тот, кто не спрашивает.
mike_tihomirov вне форума Ответить с цитированием
Старый 09.12.2010, 19:06   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

1. Не нужно смотреть на абстрактные классы и пытаться на их основе понять интерфейсы. Это разные вещи, созданы для разных целей и по сути имеют мало общего.
2. Ну добавили мы protected в интерфейс:
Код:
interface ISome
{
  public void Print();
  protected void Print1();
  protected void Print2();
}
и что нам это даст? Легальна ли будет следущая запись:
Код:
A a = new A();
a.Print2(); // Нельзя, т.к. protected
ISome some = a;
some.Print2(); //???
Ну и как быть? Если разрешить такой вызов, то будет нелогично, а так же будет возможен грязный хак в плане вызова закрытых методов.
Если запрещать такой вызов, то зачем вообще метод добавлять в интерфейс, если его использовать никак нельзя? Ну узнаем мы, что все классы, реализующие интерфейс, внутри себя имеют такие закрытые методы и что?
pu4koff вне форума Ответить с цитированием
Старый 09.12.2010, 20:32   #3
mike_tihomirov
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 58
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
1. Не нужно смотреть на абстрактные классы и пытаться на их основе понять интерфейсы. Это разные вещи, созданы для разных целей и по сути имеют мало общего.
2. Ну добавили мы protected в интерфейс:
Код:
interface ISome
{
  public void Print();
  protected void Print1();
  protected void Print2();
}
и что нам это даст? Легальна ли будет следущая запись:
Код:
A a = new A();
a.Print2(); // Нельзя, т.к. protected
ISome some = a;
some.Print2(); //???
Ну и как быть? Если разрешить такой вызов, то будет нелогично, а так же будет возможен грязный хак в плане вызова закрытых методов.
Если запрещать такой вызов, то зачем вообще метод добавлять в интерфейс, если его использовать никак нельзя? Ну узнаем мы, что все классы, реализующие интерфейс, внутри себя имеют такие закрытые методы и что?
Хорошо, а что мешает использовать такой код:
Код:
    class B : A
    {
        A a1;
        B() { a1 = new A(); a1.Print(); }
    }
protected этого ведь не запрещает, а в Майне bcпользовать обьект класса B.
Просто действительно интересный вопрос, хочу до конца разобраться, т.к. ответ Шилдта
Цитата:
"Методы, реализующие интерфейс, должны быть объявлены как public. Дело в том,
что в самом интерфейсе эти методы неявно подразумеваются как открытые, поэтому их
реализация также должна быть открытой. Кроме того, возвращаемый тип и сигнатура
реализуемого метода должны точно соответствовать возвращаемому типу и сигнатуре,
указанным в определении интерфейса. "
Это что то вроде" по тому что гладиолус!", т.е. мне не совсем понятно
почему
Цитата:
в самом интерфейсе эти методы неявно подразумеваются как открытые
а не protected к примеру.
Не бывает глупых вопросов.
Глупец тот, кто не спрашивает.
mike_tihomirov вне форума Ответить с цитированием
Старый 09.12.2010, 21:06   #4
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 534
По умолчанию

Цитата:
Хорошо, а что мешает использовать такой код:
компилятор мешает, a1 = new A() он не пропустит
m0nax вне форума Ответить с цитированием
Старый 09.12.2010, 21:14   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Интерфейс как раз и показывает то, что должно быть доступно всем (protected сюда уже не подходит). Интерфейсы не наследуют, их реализуют, т.е. интерфейс не отражает природу свойства/метода, он отражает его наличие. Поэтому public - это не гладиолус, а аксиома. Просто суть интерфейсов не поняли еще и путаете с абстрактными классами. Позже понимание само прийдёт. Я просто не знаю даже как это объяснить
pu4koff вне форума Ответить с цитированием
Старый 09.12.2010, 21:33   #6
mike_tihomirov
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 58
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Интерфейс как раз и показывает то, что должно быть доступно всем (protected сюда уже не подходит). Интерфейсы не наследуют, их реализуют, т.е. интерфейс не отражает природу свойства/метода, он отражает его наличие. Поэтому public - это не гладиолус, а аксиома. Просто суть интерфейсов не поняли еще и путаете с абстрактными классами. Позже понимание само прийдёт. Я просто не знаю даже как это объяснить
Спасибо Вам, да все придет с опытом!
Пока отложу этот вопрос.
Не бывает глупых вопросов.
Глупец тот, кто не спрашивает.
mike_tihomirov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регистрация на сайте журнала: быть или не быть Levsha100 Свободное общение 12 12.06.2010 00:39
какой тип должен быть у массива? ВикторияЯ Паскаль, Turbo Pascal, PascalABC.NET 8 21.05.2010 10:21
Быть или не быть? Вот в чем вопрос! VadEr Свободное общение 8 23.09.2009 16:16
Почему 40 минут не было доступа этим вечером Alar О форуме и сайтах клуба 5 28.11.2008 19:42
TreeView2.Items.Item[j+1].text забито мусором, а должен быть текст AlDelta Общие вопросы Delphi 1 07.09.2007 16:37