7 / 7 / 2
Регистрация: 14.12.2013
Сообщений: 94
1

Как понять такой код? Интерфейсы

18.04.2014, 22:59. Показов 904. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ситуация: разбираюсь с чужим кодом. Там рисование по SurfaceView. Код, естественно, не весь. Выборка того, что вызвало затруднения. "особо интересно" - подскажите как понимать такие объявления. Я всегда думал, что экземпляр интерфейса создать нельзя, а тут на тебе - создается. Примерно также расписываются слушатели (Listener-ы) при обработке событий. Но так я и не пойму, по каким соображениям создают экземпляр интерфейса и сразу же пишут его тело и вся эта катавасия происходит уже в методе (в конструкторе класса). Об интерфейсах читал в справочнике Шилдта. Ничего подобного не трактуется. Помогите разобраться.

Java
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class Example extends Thread {
 
private DrawHelper mDrawScreen;
 
private interface DrawHelper
    {
        void draw(Canvas canvas);
    }
 
// особо интересно
mDrawScreen = new DrawHelper()
        {
            public void draw(Canvas canvas)
            {
                refreshCanvas(canvas);
            }
        };
 
 private void draw(DrawHelper helper)
    {
        Canvas canvas = null;
        try
        {
            // подготовка Canvas-а
            canvas = mSurfaceHolder.lockCanvas(); 
            synchronized (mSurfaceHolder)
            {
                if (mInitialized)
                {
                    helper.draw(canvas);
                }
            }
        }
        catch (Exception e) { }
        finally
        {
            if (canvas != null)
            {
                mSurfaceHolder.unlockCanvasAndPost(canvas);
            }
        }
    }
 
private void refreshCanvas(Canvas canvas)
    {
        // вывод фонового изображения
        canvas.drawBitmap(mBackground, 0, 0, null);
        
        canvas.drawRect(mField, mPaint);
        
        mBall.draw(canvas);
        mUs.draw(canvas);
        mThem.draw(canvas);
 
        mScorePaint.setColor(Color.RED);
        canvas.drawText(String.valueOf(mThem.getScore()), mField.centerX(), mField.top - 10, mScorePaint);
        mScorePaint.setColor(Color.GREEN);
        canvas.drawText(String.valueOf(mUs.getScore()), mField.centerX(), mField.bottom + 25, mScorePaint);
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2014, 22:59
Ответы с готовыми решениями:

Как понять интерфейсы IEnumerator
Здравствуйте!Пытаюсь освоить этот интерфейс, и как не очень получается.Основной вопрос:имеет ли...

Понять интерфейсы
За несколько дней перечитал кучу статей. Там 100 раз о полезности интерфейсов. Но я никак не пойму,...

Не могу понять как быть с такой ошибкой(

Как бы вы отрефакторили такой код?
Как бы вы отрефакторили такой код? (Если у вас есть несколько вариантов – это только приветствуется...

5
Вежливость-главное оружие
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
19.04.2014, 01:59 2
Лучший ответ Сообщение было отмечено Igor-vrn как решение

Решение

Цитата Сообщение от Igor-vrn Посмотреть сообщение
"особо интересно"
это анонимные классы. В данном случае вы создаете экземпляр анонимного класса, который реализует (или расширяет - в случае с классами) DrawHelper, и в нем переопределяете метод draw - в общих чертах. об остальном гуглите

Цитата Сообщение от Igor-vrn Посмотреть сообщение
Я всегда думал, что экземпляр интерфейса создать нельзя
Вы совершеннно правы.

Цитата Сообщение от Igor-vrn Посмотреть сообщение
а тут на тебе - создается.
Где именно? Переменная типа интерфеса может лишь хранить ссылку на класс, которые реализует этот самый интерфес
0
7 / 7 / 2
Регистрация: 14.12.2013
Сообщений: 94
19.04.2014, 11:38  [ТС] 3
Цитата Сообщение от some_name Посмотреть сообщение
Где именно?
да вот прямо под "особо интересно":
new DrawHelper() {}

Цитата Сообщение от some_name Посмотреть сообщение
это анонимные классы
вот. Спасибо огромное. Теперь буду знать где копать
0
Вежливость-главное оружие
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
19.04.2014, 18:15 4
а "спасибо" где?
1
7 / 7 / 2
Регистрация: 14.12.2013
Сообщений: 94
19.04.2014, 23:06  [ТС] 5
Цитата Сообщение от Igor-vrn Посмотреть сообщение
вот. Спасибо огромное.
так вот же )
0
Вежливость-главное оружие
233 / 234 / 86
Регистрация: 19.02.2013
Сообщений: 1,446
19.04.2014, 23:13 6
Цитата Сообщение от Igor-vrn Посмотреть сообщение
так вот же )
0
19.04.2014, 23:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.04.2014, 23:13
Помогаю со студенческими работами здесь

Как написать такой код в си++?
Здравствуйте! Как написать такой код в си++? program ch; var a,b,c:integer; begin ...

Как написать такой код?
Добрый вечер. Помогите, разбираюсь с базами данных, увидел вот такой код for i := 0 to 9999...

Как написать такой код ?
Здравствуйте, я хочу написать код который будет менять буквы на другие, например если пользователь...

Как называется такой код?
domen.ru/%D0%A1%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 Как такой код называется? Я думал, что...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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