Реализация интерфейсов в разделяемых классах

Рассмотрим класс, который реализует множество интерфейсов. Имеет ли смысл реализовывать каждый интерфейс в отдельном файле, используя partial class определений?

Будет ли это злоупотреблением языковой функцией или это идиома, о которой я не знаю?


person Motti    schedule 13.01.2011    source источник
comment
Одна простая альтернатива, которую Visual Studio использует по умолчанию, — это регионы.   -  person CodesInChaos    schedule 13.01.2011
comment
Я не уверен, что сделал бы это для реализации интерфейса, но я сделал это раньше, чтобы разделить несколько частных вложенных классов.   -  person Dan Bryant    schedule 13.01.2011


Ответы (8)


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

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

person Jon Skeet    schedule 13.01.2011
comment
Да, действительно, определенно стоит спросить. - person Anthony Pegram; 13.01.2011
comment
Это интересное предложение, как сделать исходные файлы зависимыми друг от друга? - person Motti; 13.01.2011
comment
@Motti: вам нужно отредактировать файл проекта вручную. См. примеры на stackoverflow.com/q/223249/22656. - person Jon Skeet; 13.01.2011
comment
Существуют также расширения, которые вы можете использовать, такие как VSCommands, которые позволят вам более легко группировать элементы. - person Alex Jorgenson; 28.04.2013

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

person Oded    schedule 13.01.2011

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

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

person Klaus Byskov Pedersen    schedule 13.01.2011

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

person Alex J    schedule 13.01.2011

Единственным преимуществом является наличие различных реализаций интерфейса в отдельных физических файлах.

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

person Jay    schedule 13.01.2011

Pro: может легко определить, какая часть класса реализует какой интерфейс (хорошо, когда вы используете инструмент, который не позволяет легко перемещаться по коду внутри IDE).

Минусы: легче потерять контекст, так как теперь вам нужно перемещаться по нескольким файлам.

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

Частичный по-прежнему хорош для разделения сгенерированного кода и пользовательского кода.

person Jimmy Chandra    schedule 13.01.2011

Это имеет такой же смысл, как наличие конструкторов в одном файле частичного класса, свойств в другом файле частичного класса и т. д. и т. д.

т. е. не делайте этого, если у вас нет веской причины.

person Pedro    schedule 13.01.2011

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

В зависимости от того, сколько интерфейсов вы действительно имеете в виду под «множеством интерфейсов», вы можете использовать регионы для разделения реализаций. Это было бы нормально до 10-15 интерфейсов с общим количеством, скажем, 150 функций для реализации. После этого все станет грязным, и вы потеряете обзор. И именно здесь вы сможете воспользоваться другими механизмами, такими как наследование, инкапсуляция или агрегация, а также использование служб и вспомогательных классов.

Но я бы серьезно пересмотрел архитектуру вашего кода, если бы вам когда-нибудь пришлось реализовать более 15 интерфейсов....

person Rob Vermeulen    schedule 29.06.2017