Мне нравится концепция черт типа, потому что она решает некоторые вопросы дизайна прозрачным и расширяемым способом. Например, представьте, что у нас есть несколько классов принтеров и классов документов.Есть ли эквивалент типа символов из C++ на других языках?
Поскольку новые типы документов могут быть добавлены позже, принтер не должен напрямую знать, какой документ он печатает, поэтому его не нужно настраивать. С другой стороны, документы не должны знать обо всех принтерах.
Предоставляя характеристики о том, как печатать документы, это единственное место, которое необходимо изменить при добавлении новых документов. Более того, если есть новые принтеры, они могут использовать одни и те же черты напрямую и сосредоточиться на процессе внутренней печати, который отличается от других принтеров.
// Documents
class pdf { /* ... */ };
class txt { /* ... */ };
// Traits
template<typename t>
struct traits; // No default trait, so new documents throw compilation error
template<>
struct traits<pdf> {
static std::string get_title(pdf& document) { /* ... */ }
static std::string get_content(pdf& document) { /* ... */ }
static bool has_images = true;
};
template<>
struct traits<txt> {
static std::string get_title(txt& document) { return ""; } // Not supported
static std::string get_content(txt& document) { /* ... */ }
static bool has_images = false;
};
// Printers
class canon_printer : public printer {
template<typename T>
void print(T document) override
{
std::string title = traits<T>.get_title(document);
// ...
if (traits<T>.has_images)
// ...
}
};
Для меня это выглядит достаточно мощным. На данный момент я видел эту концепцию только на C++. Есть ли аналогичная концепция на других языках программирования? Я больше ищу языковой независимый термин для этого подхода, а не список языков.
В частности. Java или C#, Document and Printer будут интерфейсом или абстрактным классом, чтобы они могли меняться независимо друг от друга - это тот тип ответа, который вы ищете? – nos
Я не знаю никаких языков, которые имеют что-то вроде шаблонов C++ со специализацией, но, опять же, кажется, что нужно было бы перечислить * все * языки, чтобы ответить на этот вопрос. –
Черты (по крайней мере, такие как) в основном реализуют стратегический шаблон, но с временем компиляции, а не с временным разрешением. Шаблон стратегии может быть реализован практически на любом языке, который поддерживает OO. –