Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Композиция или наследование... 
V
    Опции темы
serendip
Дата 7.1.2006, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 20.12.2005

Репутация: нет
Всего: нет



Здравствуйте!
Подскажите, пожалуйста, чем отличается композиция от наследования.Наследование-это понятно что такое. А композиция?
smile (маленький, на композицию....)
Заранее благодарю
PM MAIL ICQ   Вверх
TIGERоX
Дата 7.1.2006, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


начинающий...
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.9.2005

Репутация: нет
Всего: 1



усть два класса
Код

class Foo{
  public:
    int Get(){}
};
class Bar{
   Foo f; //композиция
   public:   
   int Get(){return f.Get()}
};

т.е. мы не используем наследование а создаем объект в самом классе
PM MAIL   Вверх
serendip
Дата 7.1.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 20.12.2005

Репутация: нет
Всего: нет



Спасибо smile
PM MAIL ICQ   Вверх
blackofe
Дата 9.1.2006, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



у буча это, кажется, называется агрегацией?
PM MAIL   Вверх
np9mi7
Дата 10.1.2006, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Цитата
у буча это, кажется, называется агрегацией?
, да это у всех называется агрегацией. Вообще предпочитай композицию наследованию;


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
blackofe
Дата 10.1.2006, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



что значит "предпочитай"? наследование и агрегация - разные вещи, для разных целей. их сравнивать, все-равно что сравнивать мотоцикл с автомобилем.

Это сообщение отредактировал(а) blackofe - 10.1.2006, 01:17
PM MAIL   Вверх
Vyacheslav
Дата 10.1.2006, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



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


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
threef
Дата 10.1.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Цитата

Совет правильный. При прочих равных условиях композиция предпочтительней наследования,


Айайай, чему вы учите! Композиция и наследование используются для решения совершенно разных задач ! Ну-ка, продемонстрируй полиморфизм на базе композиции. Еще бы сравнили операторы if и while.
PM MAIL   Вверх
Void
Дата 10.1.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



threef
Думаю, если слово "наследование" заменить на "наследование реализации" вопрос несколько прояснится.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
threef
Дата 10.1.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



void
ты меня совсем запутал, давай письмом. Реализация - это обьект, класс - это тип, что такое реализация типа ?
PM MAIL   Вверх
Vyacheslav
Дата 10.1.2006, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Цитата(threef @ 10.1.2006, 12:44)
Айайай, чему вы учите! Композиция и наследование используются для решения совершенно разных задач ! Ну-ка, продемонстрируй полиморфизм на базе композиции. Еще бы сравнили операторы if и while.

Айайай. Как Вы задачи наследования ограничиваете. smile
Вы никогда о множественном наследовании не слышали?
Так вот задача:
Код
 
class A {
 public:
    func_a() ;

}; 

class B {
 public:
    func_b() ;

}; 


Нужен класс С, имеющий func_a() и func_b() ;
То есть требуется реализовать повторное использование кода без copy-past
Как будем решать задачу с учетом того, что возможны три решения? smile

Виноват, четыре решения smile


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Vyacheslav
Дата 10.1.2006, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



А что бы Вы не думали, что только меня мучают сомнения, что в конкретном случае применить, я дам пару цитат по данной проблеме

http://uic.rsu.ru/doc/programming/c++/TIC2...html#Heading428

Цитата

В мире ООП часто приходится слышать высказывания типа «композиция предпочтитель-нее наследования» (то есть лучше использовать интерфейсы, а не наследование). Благодаря средствам контроля версии в .NET выбор между наследованием и композицией уже не играет столь принципиальной роли. Используйте наследование всюду, где это уместно, — там, где существует ярко выраженная связь типа «является частным случаем».


Цитата

Действительно, в C++ скрытое (защищенное или закрытое) наследование почти всегда можно заменить скрытой агрегацией экземпляра суперкласса. Решая, с чем вы имеете дело - с наследованием или агрегацией - будьте осторожны. Если вы не уверены, что налицо отношение общего и частного (is а), вместо наследования лучше применить агрегацию или что-нибудь еще







--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
blackofe
Дата 10.1.2006, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 29.11.2005

Репутация: 4
Всего: 4



ребятки, вопрос дюже страшно интересный. я всегда полагал, что агрегация и наследование - планеты разные. и, используя наследование, я строю иерархию (или же, строя иерархию, я использую наследование). а агрегация для меня всегда была чем-то вроде - набить структуру полями.

концептуально, чем композиция лучше наследования при прочих равных условиях? просветите, плиз, меня неученого.
PM MAIL   Вверх
np9mi7
  Дата 11.1.2006, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Цитата
концептуально, чем композиция лучше наследования при прочих равных условиях? просветите, плиз, меня неученого.

Цитата
При прочих равных условиях композиция предпочтительней наследования, несмотря на то, что при ее использовании иногда требуется больше усилий по кодированию. Причина в том, что композиция представляет более слабую зависимость, чем наследование.


Это сообщение отредактировал(а) np9mi7 - 11.1.2006, 09:43


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
pablo
Дата 11.1.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



Если объект создаётся в обявлении класса, то это называется композицией.
Если же в объявлении находятся только указатели на него, то это называется агрегацией.
Добавлено @ 14:59
Inheritance and Composition
Inheritance is the feature of classes that allows one class to be derived from another. The class that you derive a new class from is called the base class, and the new class is called the derived class. Classes create a hierarchy, which is usually shown as a tree, where base classes are higher in the tree. Each derived class inherits all of the public members of the base class, and all of the private members of the base class remain private. The third member access specifier, protected, allows instances of a derived class to have access to that member. Further, you can redefine functions in base classes, providing unique functionality in the derived class. The derived class may explicitly call the function from the base class using the namespace modifier (:smile. Thus, if a base class defined the member print() and a derived class defined the same function, the derived class could call the base class’ print function with the notation, baseClass::print(). The constructor of the base class automatically executes when the derived class’ constructor is called; you therefore do not need to explicitly call this member function. A good example of simple inheritance is the stream family of classes, which you use for interacting with input and output devices. The class tree starts with ios that houses basic operations and flags, and builds with each new class providing more functionality and more specific features, such as ifstream which specializes in reading from input files.

Composition is simply defining a class as a member of another class, and all normal scope rules apply. A class that is a member of another class does not enjoy the same benefits as a derived class, and only has access to public members of the containing class.

Object-oriented design principles are encapsulation, inheritance, and polymorphism. All of these design principles are possible in C++ with classes, and programming with OOD principles is called object-oriented programming.


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1341 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.