- Наследование (является-отношением)
- Композиция (имеет связь / также называется вложением)
Код: Выделить всё
class File
{
public:
void GetFileSize() { /* Implementation */ }
};
class BMPFile :public File {};
class TextFile:public File {};
Код: Выделить всё
File
Это базовая возможность повторного использования кода с использованием наследования.
Для композиции один может иметь связь между каталогом и файлами.
Код: Выделить всё
class Directory
{
std::list list_of_files;
}
a) Какова связь между каталогом и подкаталогом?
b) Поскольку каталог содержит подкаталог, он определенно является композицией. Правильно ли я понимаю?
c) Поскольку подкаталог обладает всеми свойствами каталога, он также является наследованием. Правильно ли я понимаю?
d) Я считаю, что подкаталог имеет отношения наследования с каталогом из-за следующей аналогии.
Допустим, я хочу иметь каталог< /code> класс со следующим поведением/свойствами
Код: Выделить всё
class Directory
{
public:
virtual bool HasSubDirectory {/*Implementation code*/}
virtual void CreateSubDirectory(std::string dirName){/*Implementation code*/}
virtual void DeleteSubDirectory(){/*Implementation code*/}
virtual std::list ListAllSubDirectories{/*Implementation code*/}
};
class SubDirectory : public Directory{}
e) В Gang of Четвертый — это связь между древовидной структурой. Является ли приведенный выше пример хорошим кандидатом на шаблон проектирования композиции?
Я меняю класс Directory следующим образом
Код: Выделить всё
class Directory
{
public:
virtual bool HasSubDirectory =0;
virtual void CreateSubDirectory(std::string dirName)=0;
virtual void DeleteSubDirectory()=0;
virtual std::list ListAllSubDirectories=0;
};
class SubDirectory : public Directory{
public:
virtual bool HasSubDirectory {/*Implementation code*/}
virtual void CreateSubDirectory(std::string dirName){/*Implementation code*/}
virtual void DeleteSubDirectory(){/*Implementation code*/}
virtual std::list ListAllSubDirectories{/*Implementation code*/}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... nheritance