Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Igor-vrn
7 / 7 / 2
Регистрация: 14.12.2013
Сообщений: 93
18.04.2014, 22:59     Как понять такой код? Интерфейсы #1
Ситуация: разбираюсь с чужим кодом. Там рисование по 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);
    }
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2014, 22:59     Как понять такой код? Интерфейсы
Посмотрите здесь:

Android Кто сталкивался с такой ошибкой?
Где найти такой календарь Android
Android Как понять в какой программе создан исходник?
Во сколько обойдется написание такой программы? Android
LogCat, как понять по логам в каком месте кода произощла ошибка? Android
Как создать такой ViewPager или Как вообще такое создать? Android
Как управлять элементами через код? Android
Как распарсить такой JSON Android
Android Как сделать такой элемент?
Android Как java код скомпилировать в apk?
Не могу понять как тут обрабатывается кнопка Android
Android Как правильно скомпилировать .java код?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
some_name
Вежливость-главное оружие
 Аватар для some_name
219 / 219 / 55
Регистрация: 19.02.2013
Сообщений: 1,423
19.04.2014, 01:59     Как понять такой код? Интерфейсы #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Igor-vrn Посмотреть сообщение
"особо интересно"
это анонимные классы. В данном случае вы создаете экземпляр анонимного класса, который реализует (или расширяет - в случае с классами) DrawHelper, и в нем переопределяете метод draw - в общих чертах. об остальном гуглите

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

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

Цитата Сообщение от some_name Посмотреть сообщение
это анонимные классы
вот. Спасибо огромное. Теперь буду знать где копать
some_name
Вежливость-главное оружие
 Аватар для some_name
219 / 219 / 55
Регистрация: 19.02.2013
Сообщений: 1,423
19.04.2014, 18:15     Как понять такой код? Интерфейсы #4
а "спасибо" где?
Igor-vrn
7 / 7 / 2
Регистрация: 14.12.2013
Сообщений: 93
19.04.2014, 23:06  [ТС]     Как понять такой код? Интерфейсы #5
Цитата Сообщение от Igor-vrn Посмотреть сообщение
вот. Спасибо огромное.
так вот же )
some_name
Вежливость-главное оружие
 Аватар для some_name
219 / 219 / 55
Регистрация: 19.02.2013
Сообщений: 1,423
19.04.2014, 23:13     Как понять такой код? Интерфейсы #6
Цитата Сообщение от Igor-vrn Посмотреть сообщение
так вот же )
Yandex
Объявления
19.04.2014, 23:13     Как понять такой код? Интерфейсы
Ответ Создать тему
Опции темы

Текущее время: 02:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru