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

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

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

Author24 — интернет-сервис помощи студентам
Помогите разобраться с примером. Разбираю пример из Шилдта, стр. 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.07.2011, 17:55
Ответы с готовыми решениями:

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

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

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

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

6
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
28.07.2011, 18:51 2
Не забудь прочитать комментарии к коду.
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
35 / 35 / 15
Регистрация: 28.07.2011
Сообщений: 64
28.07.2011, 23:57 3
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 4
Цитата Сообщение от Casper-SC Посмотреть сообщение
C#
1
            return !((IEven)this).isOdd(x);
а зачем вообще этот маскарад? объясни, будь другом!
1
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
29.07.2011, 00:22 5
Цитата Сообщение от novi4ok Посмотреть сообщение
а зачем вообще этот маскарад? объясни, будь другом!
аналогино и мне поясните

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

Не по теме:

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



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

Поскольку метод isOdd() реализован в явном виде, он недоступен вне класса
MyClass. Такой способ реализации делает его надежно закрытым. Внутри класса
MyClass к методу isOdd() можно получить доступ только через ссылку на интер-
фейс. Вот почему он прекрасно вызывается для объекта "о" в реализации метода
isEven().
Миниатюры
Пример закрытой реализации интерфейса  
2
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
29.07.2011, 01:26 7
Casper-SC, большое спасибо
Цитата Сообщение от Casper-SC Посмотреть сообщение
Как насмешку типа: "Ну ты нуб" или серьёзный вопрос.
уверяю вас я спрашивал абсолютно серьёзно, кнопку "Спасибо" увы нажать не могу ибо сегодня уже много кому нажал
1
29.07.2011, 01:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2011, 01:26
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru