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

а разве наследование такая уж важная возможность? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Считывание всего файла http://www.cyberforum.ru/cpp-beginners/thread153050.html
Люди подскажите плиз как можно считать весь файл с текстом в массив?
C++ Потоки. Можете сказать что такое потоки и привести примеры на C++. P.S не надо давать ссылку на википедию. http://www.cyberforum.ru/cpp-beginners/thread153048.html
Старший бит C++
Допустим число 4 представляю в двоичной системе счисления получается 0100. В етом двоичном числе старший бит ет 3 бит?
C++ Найти в текстовом файле строки по условию
Задача была написать программу. В заданном текстовом файле найти: самую длинную строку. все строки начинающиеся с символа А. все строки, в которых имеется более трех пробелов. Написал) Без...
C++ Новый диалог не слушается http://www.cyberforum.ru/cpp-beginners/thread152995.html
такая проблема, добавляю к проекту новый диалог IDD_DIALOG2, на основой вешаю кнопку и для неё обрабочик void CTestDialog::OnButton1() { // TODO: Add your control notification handler code here...
C++ определить достижимость графа определить достижимость графа(относительно каждой вершины) плизззз кто сможет написать программу на С подробнее

Показать сообщение отдельно
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
11.07.2010, 15:35
Цитата Сообщение от nikkka Посмотреть сообщение
ну, если понадобилось улучшить класс, оставлая старый
если ты имеешь в виду, что поверх одного плохого кода, есть возможность прилепить еще один, то это неверно. Нужно не улучшать, а заранее проектировать иерархически верные наследования.

сейчас попробую привести банальный пример, но близкий к практике программирования.
допустим нам надо реализовать библиотеку для работы с сокетами. Известно, что сокеты бывают разные, протоколы бывают разные и работать надо с ними по разному, но желательно, чтобы семантика и интерфейсы были одинаковы, чтобы не надо было пользователю класса перечитывать документацию по пять раз. Остановимся на таком различии, есть сокеты, которые имеют адреса, соответствующие протоколу IPv4, а есть работающие с протоколом IPv6. Есть сокеты UDP, TCP и т.д.
Если для каждого такого сокета писать отдельную реализацию, то выходит просто неимоверное количество дублируемого кода (большинство функций реализуются все равно одинаково). А тогда почему бы не написать сначала базовый абстрактный класс (для предоставления интерфейса дочерним классам). Потом дочерние классы UDPSocket и TCPSocket, от TCP сделать еще один HTTPSocket.
Понятное дело можно увлечься и тогда вся иерархия превратиться в труднопонимаемые куски кода, которые невозможно поддерживать. Дабы не быть голословным вот небольшой кусочек кода.

C++
1
2
3
4
5
6
7
8
9
10
11
class Socket
{
    void Create();
    void Close();
 
    void Attach();
    void Detach();
 
    virtual void Send();
    virtual void Receive();
};
допустим функции Create(), Close(), Attach(), Detach() реализуются для всех дочерних классов одинаково. Их переопределять не стоит.
C++
1
2
3
4
5
6
7
8
9
10
11
class SocketUDP : public Socket
{
    void Send();
    void Receive();
};
 
class SocketTCP : public Socket
{
    void Send();
    void Receive();
}
неправда ли так куда удобнее, чем воротить два полноценных раздельных класса
учитывая, что это самый небольшой примерчик, а настоящие реализации могут достигать сотен строк.
ну а теперь надо от SocketTCP наследовать SocketHTTP. А без возможности наследования пришлось бы еще дублировать код и класса базового сокета. Ужас же.
C++
1
2
3
4
5
6
7
class SocketHTTP : public SocketTCP
{
    void SetUrl();
    void GetUrl();
    void SetUri();
    void GetUri();
}
Попробуй теперь даже вот эти небольшие примерчики переписать в отдельности. А если в базовом классе нашлась небольшая ошибочка? или просто понадобилось улучшение? переписывать все классы?

Не по теме:

К тому же наследование это тупо интересно



Добавлено через 3 минуты
Цитата Сообщение от fasked Посмотреть сообщение
есть сокеты, которые имеют адреса, соответствующие протоколу IPv4, а есть работающие с протоколом IPv6.
Хотел написать еще про два класса IPv4Address и IPv6Address для полного счастья, вставить их членом класса и забыл
2
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru