Каковы преимущества использования частичного класса по сравнению с абстрактным? - PullRequest
8 голосов
/ 29 июня 2009

Я читал Программирование Microsoft® Visual C # ® 2008: Язык, чтобы лучше понять C # и что с ним можно сделать. Я столкнулся с частичными классами, с которыми я уже сталкивался из класса Page ASP.Net Page.

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

Я просто упускаю точку в частичном классе. Также может кто-то обеспечить использование в реальном мире.

Ответы [ 8 ]

19 голосов
/ 29 июня 2009

Частичные классы не имеют ничего общего с наследованием объектов. Частичные классы - это просто способ разделения исходного кода, который определяет класс, на отдельные файлы (это делается, например, при создании новой формы в приложении Windows Forms - один файл является «вашим» кодом, другой файл .designer.cs). содержит код, которым управляет VS2008).

4 голосов
/ 29 июня 2009

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

Вот одна мысль о сгенерированных для вас классах Linq to SQL. Они генерируются автоматически, то есть вы не должны их изменять. Без частичного класса вы не можете присоединить интерфейс. Вы можете создать новый класс и извлечь его из класса Linq to sql, но это действительно ничего вам не даст, потому что вы не можете вывести класс linq to sql в свой класс с помощью интерфейса.

4 голосов
/ 29 июня 2009

Хорошим примером использования является случай, когда генерируется одна сторона частичного класса (например, ORM)

2 голосов
/ 07 апреля 2011

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

Если у вас большой класс, это уже неправильно. Код должен быть реорганизован в несколько «реальных» классов вместо нескольких файлов. Большие классы в целом означают, что класс делает слишком много вещей и нарушает SRP (принцип единой ответственности).

1 голос
/ 17 июня 2013

Похоже, ваш вопрос в чем разница между

partial class Foo
{
  PART ONE
}
partial class Foo
{
  PART TWO
}

и

astract class FooBase
{
  PART ONE
}
partial class Foo : FooBase
{
  PART TWO
}

Хотя они могут показаться чем-то похожими, и в некоторых случаях последняя конструкция может использоваться вместо первой, с последним стилем есть как минимум две проблемы:

-1- Тип FooBase, вероятно, должен был бы знать идентичность конкретного типа, который должен был быть его производным, и всегда использовать переменные этого типа, а не типа FooBase. Это представляет собой неудобно тесную связь между двумя типами.

-2- Если тип Foo является открытым, тип FooBase также должен быть открытым. Даже если все конструкторы FooBase равны internal, внешний код мог бы определять классы, производные от FooBase, но не Foo; создание экземпляров таких классов было бы сложно, но не невозможно.

Если бы у производного типа была возможность расширить видимость базового типа, эти проблемы не были бы чрезмерно проблематичными; можно было бы считать FooBase «одноразовым» идентификатором, который будет появляться ровно дважды: один раз в его объявлении и один раз в строке объявления для Foo, и считать, что каждый FooBase будет замаскированным Foo. Тот факт, что FooBase не может использовать Foo членов экземпляра на this без трансляции типов, может быть утомительным, но также может способствовать хорошему разбиению кода. Однако, поскольку невозможно расширить видимость базового типа, дизайн абстрактного класса выглядит странно.

1 голос
/ 29 июня 2009

Частичный класс теперь активно используется в ASP.Net, чтобы разрешить двум исходным файлам example.aspx на основе разметки и example.aspx.cs на основе кода, чтобы методы и переменные, определенные в каждом из них, были видны каждому. в примере .aspx

<custom:exampleControl id="exampleCntr" property="<%#getProperty()%>" />

в примере .aspx.cs

private object GetProperty(){ // called from aspx
    return DateTime.Now;
}

private void DoStuff(){
    ExampleControl c = exampleCntr; //exampleCntr is defined in aspx.
}

Двунаправленный характер этого нельзя воссоздать с помощью абстрактных классов.

0 голосов
/ 29 июня 2009

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

0 голосов
/ 29 июня 2009

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

...