Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
iser
1 / 1 / 0
Регистрация: 21.01.2013
Сообщений: 40
1

Для чего нужны интерфейсы?

18.03.2014, 08:44. Просмотров 1518. Ответов 13
Метки нет (Все метки)

Объясните на пальцах для чего нужны интерфейсы, как я понял они описывают методы и свойства, которые при наследовании классами должны были реализовать их, а для чего это делать?
Читаю так же COM объекты, там все построено на интерфейсах и я понимаю, что не понимаю до конца смысла интерфейсов.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2014, 08:44
Ответы с готовыми решениями:

Для чего нужны указатели?
Кто может объяснить для чего нужны указатели и смысл их? в интернете одна муть и еще для чего нужно...

для чего нужны хеш таблицы?
для чего нужны хеш таблицы? если есть массивы )

Для чего нужны статические массивы?
Никак не могу понять, для чего они нужны в программировании, ведь есть динамические и их можно...

Для чего нужны callback-функции
Для чего нужны callback-функции? И можно привести какой-нибуль пример по их использованию.

Для чего нужны заголовочные файлы?
Ещё раз всем здрасьте , последний вопрос в котором я не могу разобраться - Для чего нужны...

13
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,039
18.03.2014, 09:00 2
Цитата Сообщение от iser Посмотреть сообщение
Объясните на пальцах для чего нужны интерфейсы
чтобы общаться... методы которые предоставляет тот или иной класс нужны для взаимодействия с внешним миром, представь себе класс, у которого все методы и данные закрыты, как ты к нему обратишься и вообще для чего он нужен?(ну только если он не базовый, а просто закрытый полностью отдельный класс)
0
0x10
2638 / 1792 / 298
Регистрация: 24.11.2012
Сообщений: 4,453
18.03.2014, 09:16 3
dzrkot, автор как бы про другие интерфейсы спрашивает)

iser, А по теме: читайте книги. Да даже в википедии есть статья с примерами. http://ru.wikipedia.org/wiki/%D0%98%...BD%D0%B8%D0%B5)
0
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,039
18.03.2014, 09:17 4
Цитата Сообщение от 0x10 Посмотреть сообщение
dzrkot, автор как бы про другие интерфейсы спрашивает)
ок =((
0
iser
1 / 1 / 0
Регистрация: 21.01.2013
Сообщений: 40
18.03.2014, 09:19  [ТС] 5
Спасибо за быстрый ответ.
Что то все равно не понятно, вот к примеру пример, в нем интерфейс и два класса, каким образом реализовывается общение?
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
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>
 
class ILoad
{
public:
    virtual void StartLoading()=0;
    virtual bool IsFinish()=0;
};
 
class CImg : public ILoad
{
public:
    CImg(){};
    ~CImg(){};
private:
    virtual void StartLoading()
    {
        printf("Img -> StartLoading");
    }
    virtual bool IsFinish()
    {
        return true;
    }
};
 
class CVideo : public ILoad
{
public:
    CVideo(){};
    ~CVideo(){};
private:
    virtual void StartLoading()
    {
        printf("Video -> StartLoading");
    }
    virtual bool IsFinish()
    {
        return true;
    }
};
 
void main()
{
    CImg a;
    CVideo b;
    a.StartLoading();
    if( a.IsFinish() )
    {
        printf(" a -> IsFinish = TRUE ");
    }
}
0
0x10
2638 / 1792 / 298
Регистрация: 24.11.2012
Сообщений: 4,453
18.03.2014, 09:20 6
iser, можно написать функцию, которая принимает ILoad и передавать объект любого конкретного типа, реализующего этот интерфейс.
0
iser
1 / 1 / 0
Регистрация: 21.01.2013
Сообщений: 40
18.03.2014, 09:45  [ТС] 7
Так так, извиняюсь за глупый вопрос.
Если объект, реализующий интерфейс ILoad, содержит реализацию метода который не описывает ILoad, он тоже передается?
Я понимаю так:
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
#include <stdio.h>
 
class ILoad
{
public:
    virtual void StartLoading()=0;
};
 
class CImg : public ILoad
{
public:
    CImg(){};
    ~CImg(){};
    void Prew()
    {
       printf("Img -> Prew");
    }
private:
    virtual void StartLoading()
    {
        printf("Img -> StartLoading");
    }
};
 
 
void main()
{
    void Func(ILoad a){
          a.StartLoading();
          a.Prew(); // Вот это вызовется?
    }
}
0
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,039
18.03.2014, 10:25 8
Цитата Сообщение от iser Посмотреть сообщение
a.Prew(); // Вот это вызовется?
нет
0
alsav22
5450 / 4845 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
18.03.2014, 10:38 9
Цитата Сообщение от iser Посмотреть сообщение
ILoad a
Так не создастся объект.

Добавлено через 4 минуты
Цитата Сообщение от iser Посмотреть сообщение
Если объект, реализующий интерфейс ILoad, содержит реализацию метода который не описывает ILoad, он тоже передается?
Передаётся куда? Из ILoad в производный класс? Но если его нет, то что должно передаться?
0
Alex5
1124 / 784 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
18.03.2014, 11:29 10
Цитата Сообщение от iser Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class ILoad
{
public:
 virtual void StartLoading()=0;
};
class CImg : public ILoad
{
public:
 CImg(){};
 ~CImg(){};
 void Prew()
 {
 printf("Img -> Prew");
 }
private:
 virtual void StartLoading()
 {
 printf("Img -> StartLoading");
 }
};
Пример использования CImg
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//void FuncError( ILoad a )  /*  error C2259: ILoad: невозможно создать экземпляр абстрактного класса  */
//{
//  a.StartLoading();
//}
 
void FuncOK( ILoad* p )
{
    p->StartLoading(); /* метод StartLoading() объявлен в (абстрактном) классе ILoad */
}
 
void main()
{
    CImg im; /* класс CImg является производным от класса ILoad */
    FuncOK( & im ); 
}
0
iser
1 / 1 / 0
Регистрация: 21.01.2013
Сообщений: 40
20.03.2014, 21:16  [ТС] 11
Спасибо за ответ, чет на почту не пришли уведомления, поэтому отвечаю с задержкой.
Цитата Сообщение от Alex5 Посмотреть сообщение
void FuncOK( ILoad* p )
ILoad* p - Это указатель на тип класса ILoad? Почему именно указатель?
Цитата Сообщение от Alex5 Посмотреть сообщение
FuncOK( & im );
& im - достает адрес класса CImg, почему именно ссылка, а не указатель на im?
0
alsav22
5450 / 4845 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.03.2014, 21:23 12
Цитата Сообщение от iser Посмотреть сообщение
Почему именно указатель?
Про виртуальность и полиморфизм почитайте.
Цитата Сообщение от iser Посмотреть сообщение
& im - достает адрес класса CImg, почему именно ссылка, а не указатель на im?
Где здесь ссылка? Функция принимает указатель (адрес), ей передаётся адрес объекта im.
0
iser
1 / 1 / 0
Регистрация: 21.01.2013
Сообщений: 40
20.03.2014, 21:39  [ТС] 13
Цитата Сообщение от alsav22 Посмотреть сообщение
Про виртуальность почитайте.
Я читал, но видимо до конца не понял, для этого необходимо указывать виртуальные методы? Или я что то не понимаю.
0
alsav22
5450 / 4845 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.03.2014, 21:50 14
Указатель или ссылка на базовый класс может быть связана с объектом производного. Если метод вирутальный, то вызов его будет по типу объекта, с которым связан указатель или ссылка, если не виртуальный, то по типу указателя.
1
20.03.2014, 21:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2014, 21:50

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

try catch throw для чего нужны?
Для чего нужны эти операторы? Линканите пожалуйста статью, где доходчиво объяснено их применение,...

Для чего нужны файлы с расширением .h, .c?
Не подскажите, для чего нужен (.h) и (.c) файл? А (.cpp)? Я читал, что это заголовочный файл, но за...


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

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

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