2015-06-14 2 views
4

Я увлечен возможностями красивого кода с расширением протокола . Но я, кажется, не понимаю реальной разницы между наследованием класса.Преимущества наследования классов, когда вы можете использовать расширения протокола?

Я знаю, что есть разные способы моделирования чего-то, например, я мог бы использовать композицию вместо наследования класса.

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

Итак, вопрос в том, какие функции имеют наследование классов, какие расширения протокола нет; или когда использовать наследование классов вместо расширений протокола.

+1

Это не прямой ответ, а скорее теоретический, но я где-то где-то красный, что вы должны использовать наследование класса, когда подкласс *** IS *** является экземпляром суперкласса и использует протоколы всякий раз, когда ваш класс ** * HAS *** свойства протокола. –

+1

Это больше похоже на разницу между наследованием и композицией. – Binarian

ответ

0

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

Если А суперкласс B. Тогда вы можете создать и не заботиться ни о чем из В.

С протоколами вы всегда должны использовать усыновившую структуру/класс.

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

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

Если P2 принимает P1 и P1E, то расширение для P1 и P2E является расширением P2, тогда вам необходимо создать struct/class, который принимает P1, только для получения менее способной версии struct/class, который использует P2 ,

1

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

Но это лишь незначительные льготы, по крайней мере, для меня.

+1

Одно оповещение: вы можете добавить инициализаторы удобства в расширениях Swift, а не назначенные инициализаторы. – Binarian

1

Если не для Какао, их может не быть.

Понятно, что «когда вы работаете с протоколами, используете расширения и когда имеете дело с объектами, используйте подклассы».

Чтобы быть менее простым в этом, когда вы программируете в Swift, вам придется иметь дело с Cocoa, и когда вы имеете дело с Cocoa, вам придется иметь дело с объектами. И когда вам приходится иметь дело с объектами, иногда лучший способ сделать что-то будет подклассом.

Возьмите UIViewController, с которым мы все должны считаться. Насколько мне известно, нет UIViewControllerProtocol. Это означает, что у UIViewController есть много запеченного поведения, которое нельзя просто повторить, объявив о соответствии протоколу. Если вы хотите, чтобы у вашего основного приложения UIViewController была пользовательская функциональность - что мы все делаем - вам нужно подклассифицировать ее. И тогда вы получаете все это поведение через наследование.

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

Который, для нас Быстрые люди, часто случается.

+1

Риса, испеченного в поведении, не нужно будет дополнять снова. У расширений протокола есть реализации для них. Это новая вещь о протоколах, полностью реализованные функции в самом протоколе. Нет, я не понимаю, почему я должен использовать подклассы, и вы не приводите пример, почему я должен. – Binarian

+1

@ ViktorLexington, я бы хотел, чтобы вы нежно спросили, используете ли вы 'UIViewController' - я полагаю, если бы вы это сделали, вы бы поняли, насколько это применимо. Если вы этого не сделали, пожалуйста, поймите, вы говорите абстрактно, сравнивая два гипотетических класса, каждый из которых реализует ту же функциональность по-разному. В таком случае вы были бы правы. Но вот почему я сказал: «Если бы не Какао, их могло не быть». Cocoa - это * в основном * классы без соответствующих протоколов и, следовательно, нет пути к доступу (или в некоторых случаях даже к созданию) расширений протокола по умолчанию. –