Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/16: Рейтинг темы: голосов - 16, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 26.07.2011
Сообщений: 8

Пример закрытой реализации интерфейса

28.07.2011, 17:55. Показов 3193. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите разобраться с примером. Разбираю пример из Шилдта, стр. 332, где устанавливается факт четности и нечетности числа:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// Явная реализация члена интерфейса.
 
using System;
 
interface IEven
{
    bool isOdd(int x);
    bool isEven(int x);
}
 
class MyClass : IEven
{
 
    bool IEven.isOdd(int x)
    {
        if ((x % 2) != 0) return true;
        else return false;
    }
 
    public bool isEven(int x)
    {
        MyClass o = this; // Ссылка на вызывающий объект.
 
        return !o.[COLOR="Red"]isOdd[/COLOR](x);
    }
}
 
class Demo
{
    public static void Main()
    {
        MyClass ob = new MyClass();
        bool result;
 
        result = ob.isEven(4);
        if (result) Console.WriteLine("4 - четное число.");
        else Console.WriteLine();
 
        // result = ob.isOdd(); // Ошибка, член не виден.
    }
}
Вопросы:

1) Все перепроверил, пример не компилируется, подчеркивает isOdd в конструкции !o.isOdd(x).
2) Есть ли разница между public interface IEven и просто interface IEven? Ведь методы в интерфейсе все по-умолчанию public.
3) Именно явная реализация bool IEven.isOdd(int x) делает метод закрытым, т.к. отсутствует спецификатор public?
4) на что конкретно тут ссылается ссылка this?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.07.2011, 17:55
Ответы с готовыми решениями:

Использование интерфейса без реализации
Добрый день. Подскажите, корректно ли использовать интерфейс не содержащий реализации для, скажем так, пометки класса, для последующей...

Ошибка при реализации интерфейса
Доброго дня. Пытаюсь создать список с данными для дальнейшего использования, но что-то делаю не так. В чём может заключаться проблема? ...

Проблема реализации методов интерфейса
Совсем недавно добралась до этой темы, так что пытаюсь освоить. Есть два класса : book и studentbook, где studentbook - дочерний класс от...

6
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
28.07.2011, 18:51
Не забудь прочитать комментарии к коду.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    interface IEven
    {
        bool isOdd(int x);
        bool isEven(int x);
    }
 
    class MyClass : IEven
    {
 
        public bool isOdd(int x) //был не виден, потому-что у тебя он private (если не указан модификатор доступа, то по умолчанию он private)
        {
            if ((x % 2) != 0) return true;
            else return false;
        }
 
        public bool isEven(int x)
        {
            return !this.isOdd(x); //this ссылка на текущий экземпляр класса. В данном случае можно вообще не использовать this. 
        }
    }
 
    class Demo
    {
        public static void Main()
        {
            MyClass ob = new MyClass();
            bool result;
 
            result = ob.isEven(4);
            if (result) Console.WriteLine("4 - четное число.");
            else Console.WriteLine();
 
             result = ob.isOdd(7); 
        }
    }
1) Ссылаться на this мягко говоря странно. Смотри мой пример.

Добавлено через 4 минуты
Вот тебе явная реализация интерфейса:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    interface IEven
    {
        bool isOdd(int x);
        bool isEven(int x);
    }
 
    class MyClass : IEven
    {
 
        bool IEven.isOdd(int x)
        {
            if ((x % 2) != 0) return true;
            else return false;
        }
 
        public bool isEven(int x)
        {
            return !((IEven)this).isOdd(x);
        }
    }
 
    class Demo
    {
        public static void Main()
        {
            MyClass ob = new MyClass();
            bool result;
 
            result = ob.isEven(4);
            if (result) Console.WriteLine("4 - четное число.");
            else Console.WriteLine();
 
            result = ((IEven)ob).isOdd(7);
            Console.ReadKey();
        }
    }
1
 Аватар для metacoder
35 / 35 / 15
Регистрация: 28.07.2011
Сообщений: 64
28.07.2011, 23:57
C#
1
2
3
4
        public bool isOdd(int x)
        {
            return ((x % 2) != 0);
        }
Шилдт он научит
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
29.07.2011, 00:18
Цитата Сообщение от Casper-SC Посмотреть сообщение
C#
1
            return !((IEven)this).isOdd(x);
а зачем вообще этот маскарад? объясни, будь другом!
1
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
29.07.2011, 00:22
Цитата Сообщение от novi4ok Посмотреть сообщение
а зачем вообще этот маскарад? объясни, будь другом!
аналогино и мне поясните

реализация в классе
Цитата Сообщение от Casper-SC Посмотреть сообщение
C#
1
bool IEven.isOdd(int x)
почему не просто
C#
1
bool isOdd(int x)
?
1
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
29.07.2011, 01:21
Цитата Сообщение от novi4ok Посмотреть сообщение
а зачем вообще этот маскарад? объясни, будь другом!

Не по теме:

Даже не знаю как это воспринимать. Как насмешку типа: "Ну ты нуб" или серьёзный вопрос (сначала воспринял как насмешку из-за слова "маскарад" :)).



Потому-что интерфейс явно реализует метод. К нему нельзя обратиться так:
Цитата Сообщение от Maxwe11 Посмотреть сообщение
почему не просто
Код C#1 bool isOdd(int x)
?
Герберт Шилдт. Полный справочник по C#. > стр. 332 <
Явная реализация членов интерфейса может понадобиться по двум причинам. Во-
первых, реализуя метод с использованием полностью квалифицированного имени, вы
тем самым обозначаете части закрытой реализации, которые не "видны" коду, опре-
деленному вне класса. Во-вторых, класс может реализовать два интерфейса, которые
объявляют методы с одинаковыми именами и типами. Полная квалификация имен
позволяет избежать неопределенности ситуации.

Поскольку метод isOdd() реализован в явном виде, он недоступен вне класса
MyClass. Такой способ реализации делает его надежно закрытым. Внутри класса
MyClass к методу isOdd() можно получить доступ только через ссылку на интер-
фейс. Вот почему он прекрасно вызывается для объекта "о" в реализации метода
isEven().
Миниатюры
Пример закрытой реализации интерфейса  
2
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
29.07.2011, 01:26
Casper-SC, большое спасибо
Цитата Сообщение от Casper-SC Посмотреть сообщение
Как насмешку типа: "Ну ты нуб" или серьёзный вопрос.
уверяю вас я спрашивал абсолютно серьёзно, кнопку "Спасибо" увы нажать не могу ибо сегодня уже много кому нажал
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.07.2011, 01:26
Помогаю со студенческими работами здесь

Класс, требующий реализации интерфейса
Класс, требующий реализации интерфейса Помогите разобраться. Пытаюсь изучить интерфейсы, пробую различные ситуации. Обратил...

Замечание и критика по реализации интерфейса
Друзья, прошу подсказать, как можно более правильнее реализовать интерфейс. Жду здравой критики и разноса :popcorn: Взял для примера...

Исключение при реализации интерфейса IComparable
При сравнении метод Array.Sort(db_object); выдает исключение {&quot;По крайней мере в одном объекте должен быть реализован интерфейс...

Модификатор доступа при реализации интерфейса
Почему в первом случае допустим модификатор ,а во втором нет

Причины явной реализации членов интерфейса
Шилдт описывает две причины явной реализации членов интерфейсов, но мне не понятна одна из них. Вот, что он пишет: когда интерфейсный метод...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru