Введение

В последнее время я работал над проектом флаттера вместе с другими товарищами по команде, и это довольно смешно, что то, как вы справляетесь со своими классами и структурируете свой проект, может стать настоящей проблемой. Иногда применение общеизвестных типов, таких как абстрактные классы или перечисления, не приходит вам в голову так плавно, как предполагалось.

Я попытаюсь продемонстрировать, как вы можете определить, когда нужно применять абстрактные классы, и как это может спасти жизнь в будущем.

Абстрактные классы

Прежде всего, я объясню, что такое абстрактный класс. Абстрактный класс по определению — это класс, который не может быть создан. Это означает, что вы не можете создать экземпляр абстрактного класса, т.е. вы не сможете выполнить new myAbstractClass(). Итак, сразу же возникает вопрос: с какой стати мне нужен абстрактный класс, который я не могу использовать? Что ж, позвольте мне сказать вам, что вы можете использовать его, но не напрямую. Чтобы показать вам это, я продемонстрирую полезность этого на примере.

Представьте, что у нас есть сообщение типа A, в котором этот класс имеет несколько полей, таких как свойства title, subtitle, create_date, description и user_info. Иногда после этого вам нужно добавить другой тип сообщения. Допустим, запись типа B, которая показывает точно такую ​​же информацию, но с добавлением некоторого свойства metrics.

Доступные варианты

Первый заключается в том, что вы просто создаете новый класс со всеми теми же свойствами и добавляете свойство метрик, чтобы выполнить требование. У этого есть некоторые неудобства, такие как повторение кода, поддержка двух разных классов и наличие двух списков, набранных по-разному, для отображения всех этих сообщений, поскольку вы не сможете сохранить их в одной и той же переменной списка. Еще одна вещь, которую следует иметь в виду, это то, как вы собираетесь смешивать эти два списка, чтобы отображать все сообщения на одном экране!?

Второй вариант — использовать абстрактные классы.

Во-первых, вы должны определить общие свойства между этими двумя классами. Как мы указали в нашем примере, это будут свойства title, subtitle, create_date, description и user_info. Это те, которые вы собираетесь предоставить базовому классу для обработки, поэтому мы должны создать базовый класс с именем BasePost, содержащий все свойства, которые являются общими для наших двух обязательных сообщений. то есть:

Следующим шагом является создание двух новых классов, которые расширяются от вашего базового класса, поэтому скажем, что мы создаем классы PostA и PostB и делаем их наследниками нашего Класс BasePost. Это заставит PostA и PostB наследовать все базовые свойства, и таким образом вы сможете получить к ним доступ (id и общее количество комментариев) через конкретную реализацию. Обратите внимание на то, как инициализировать свойства в методе конструктора. то есть:

Преимущества и как ими воспользоваться

Такая структура наших классов помогает нам иметь оба типа сообщений в одном списке. Вы должны подумать: «Но ведь вам все равно придется ходить в разные классы!» Да, это правильно, но поскольку они полагаются на базовый класс, вы можете легко создать список, типизированный базовым классом, и все! Список теперь позволит вам вставить оба класса в один и тот же список.

Таким образом, вы также можете начать создавать общие виджеты, которые отображают одну и ту же информацию из обоих классов (например, во всплывающем окне), заставив этот виджет принимать элемент BasePost.

Выводы

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