Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Igor-vrn
7 / 7 / 2
Регистрация: 14.12.2013
Сообщений: 94
#1

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

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

Ситуация: разбираюсь с чужим кодом. Там рисование по 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2014, 22:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как понять такой код? Интерфейсы (Программирование Android):

Как сделать такой элемент? - Программирование Android
Добрый вечер! Нужно сделать локальный переключатель картинок - как такое сделать? Что нужно смотреть\искать\использовать? На...

Как реализовать такой элемент - Программирование Android
Как реализовать такой элемент в меню? (Элементы: Строки с текстом, изображением)

Как распарсить такой JSON - Программирование Android
{"response":} Как распарарсить такой JSon нужно выделить из массива первое число а дальше все uid и body?? Можете подсказать? ...

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

Как бы вы отрефакторили такой код? - C#
Как бы вы отрефакторили такой код? (Если у вас есть несколько вариантов – это только приветствуется – опишите все) public void...

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

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

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

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

Цитата Сообщение от some_name Посмотреть сообщение
это анонимные классы
вот. Спасибо огромное. Теперь буду знать где копать
0
some_name
Вежливость-главное оружие
226 / 224 / 55
Регистрация: 19.02.2013
Сообщений: 1,441
19.04.2014, 18:15 #4
а "спасибо" где?
1
Igor-vrn
7 / 7 / 2
Регистрация: 14.12.2013
Сообщений: 94
19.04.2014, 23:06  [ТС] #5
Цитата Сообщение от Igor-vrn Посмотреть сообщение
вот. Спасибо огромное.
так вот же )
0
some_name
Вежливость-главное оружие
226 / 224 / 55
Регистрация: 19.02.2013
Сообщений: 1,441
19.04.2014, 23:13 #6
Цитата Сообщение от Igor-vrn Посмотреть сообщение
так вот же )
0
19.04.2014, 23:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2014, 23:13
Привет! Вот еще темы с ответами:

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

Как вы думайте пойдет такой код? - Delphi
Нужно разделить строку к примеру 123%456?789. В эдит2 запихнуть 123, в эдит3 - 456, в эдит4 - 789. Вот начеркал код - var ...

Как правильно написать такой код - PHP
Как правильно написать код который будет следовать такой логике: если от текущей до первой страницы страниц больше 6 то между текущая...

как понять код? - C++
#include <string.h> int main() { char str = "abcdef"; int slen = strlen(str); for(int i=0;i<slen/2;i++) { ...


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

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

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