Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Igor-vrn
7 / 7 / 2
Регистрация: 14.12.2013
Сообщений: 94
#1

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

18.04.2014, 22:59. Просмотров 606. Ответов 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
Ответы с готовыми решениями:

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

Как распарсить такой JSON
{"response":} Как распарарсить такой JSon нужно выделить из массива первое число а дальше все...

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

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

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

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

Решение

Цитата Сообщение от 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
Вежливость-главное оружие
227 / 225 / 86
Регистрация: 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
Вежливость-главное оружие
227 / 225 / 86
Регистрация: 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

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

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

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


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

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

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