Недавно я узнал о composite pattern
. Я хочу использовать его в своем задании, которое я должен реализовать для классов File и Folder. Я понимаю, что подклассы, такие как CFile
и Cfolder
, имеют одинаковые атрибуты (name
и size
). Так хорошо для меня, чтобы положить атрибуты в interface
? Насколько я знаю, это не очень хорошая практика. Однако я не понимаю, почему я не должен. Или есть другие решения? Можно ли положить данные в интерфейс?
ответ
Я бы сказал, что это не проблема. Разница в том, что вместо чистого класса интерфейса у вас есть базовый класс . Однако, если вы хотите сохранить гибкость в использовании интерфейса для реализаций, которые не привязаны к этим конкретным переменным-членам, вы всегда можете создать класс интерфейса , а также базовый класс для полной гибкости. Хотя это может быть слишком сложным, слишком рано, вы всегда можете разделить интерфейс от аннотация базы позже, если вам нужно.
using CItemUPtr = std::unique_ptr<class CItem>;
/**
* Interface class
*/
class CItem
{
public:
virtual ~CItem() {}
virtual CItemUPtr findByName(std::string const& name) = 0;
virtual void setHidden(bool a, bool b) = 0;
};
/**
* Abstract base class
*/
class AbstractCItem
: public CItem
{
protected:
std::string name;
std::size_t size;
};
class CFile
: public AbstractCItem
{
public:
CItemUPtr findByName(std::string const& name) override
{
// stuff
return {};
}
void setHidden(bool a, bool b) override {}
};
На самом деле это не вопрос «это хорошая практика». Создавая интерфейс, вы определяете стандарт. Вопрос в том, вам НЕОБХОДИМО реализовать интерфейс, чтобы содержать эти элементы данных? Вы находитесь в лучшем положении, чтобы понять вашу реализацию, так что вы действительно единственный, кто может ответить на это.
Как правило, класс, реализующий интерфейс, должен быть черным ящиком, а внешний мир не должен иметь доступа к каким-либо внутренним элементам (включая данные членов). Интерфейсы определяют общую функциональность, которая требуется для поддержки интерфейса, и я ожидал бы, что эти детали реализации будут похоронены в базовой реализации класса только в качестве общего правила. YMMV.
Принцип конструкции для класса должны быть:
«Невозможно разорвать класс инвариант с внешней стороны»
Если конструктор (s) установить классу инвариант, и все члены
поддерживают инвариант класса, это достигается.
Однако, если класс не имеет инварианта к классу, то
Публичные члены получают то же самое.
// in C++, this is a perfectly fine, first order class
struct Pos
{
int x,y;
Pos& operator+=(const Pos&);
};
Что это связано с интерфейсами? –
- 1. Можно ли положить -preserve-merges в gitconfig
- 2. Можно ли положить NUL (\ x00) в xml
- 3. Можно ли положить FormLayout в GridLayout?
- 4. можно ли положить это в петлю?
- 5. Можно ли положить все приложение в $ _SESSION?
- 6. Можно ли динамически добавлять данные в пользовательский интерфейс таблицы sapui5?
- 7. Можно ли положить весь CoreData-Stack в рамки?
- 8. Можно ли положить круглые скобки внутри строки?
- 9. можно ли положить эффекты после html5?
- 10. Можно ли принудительно обновить интерфейс?
- 11. Можно ли определить интерфейс Singleton в PHP?
- 12. Можно ли ввести интерфейс в Laravels Kernel.php?
- 13. Можно ли привести родной интерфейс в Cocos2dx
- 14. Можно ли положить контейнер в компонент в Redux?
- 15. Можно ли положить статические элементы XAML в массив?
- 16. Можно ли положить большой нет. изображений в drawable
- 17. C# - Можно ли положить что-нибудь в скобки? Console.Read()
- 18. Можно ли положить код, подверженный ошибкам, в инструкцию OR?
- 19. Можно ли положить две ko.applyBindings() в ту же функцию?
- 20. PHP Regex: Можно ли положить конец строки $ в диапазоне?
- 21. Можно ли положить слова, введенные пользователем в файл?
- 22. Можно ли положить кубернете в контейнер для докеров?
- 23. Можно ли положить панель действий внизу в Android?
- 24. Можно ли получить все классы, реализующие интерфейс?
- 25. Можно ли ограничить конструкторы классов, реализующих интерфейс?
- 26. Можно ли вводить интерфейс с угловым2?
- 27. Можно ли настроить Android-интерфейс SpeechRecognizer UI?
- 28. как можно положить true в match.success C#?
- 29. Можно ли проверить, активирован ли интерфейс в pcap?
- 30. Можно ли расширить стандартный пользовательский интерфейс
C++ не имеет отчетливый "интерфейс", просто абстрактные классы. В интерфейсе, например. Java, просто невозможно иметь переменные. – deviantfan
Если вы храните их в абстрактном базовом классе (без интерфейсов на C++) в качестве общедоступных полей, то вы несете бремя для разработчика производного класса, чтобы обновлять поля. Если вы поместите их в базовый класс как виртуальные (чистые) геттеры, то вы заставите исполнителя задуматься о них. –