logo search
CSharp_Prog_Guide

Разделяемый класс

Существует несколько ситуаций, при которых желательно разделение определения класса:

---

Ключевое слово partial указывает на то, что другие части класса, структуры или интерфейса могут быть определены в пространстве имен. Все части должны использовать ключевое слово partial. Для формирования окончательного типа все части должны быть доступны во время компиляции. Все части должны иметь одинаковые специальные возможности, например public, private и т.д.

If any part is declared abstract, then the whole type is considered abstract. If any part is declared sealed, then the whole type is considered sealed. If any part declares a base type, then the whole type inherits that class.

All the parts that specify a base class must agree, but parts that omit a base class still inherit the base type. Parts can specify different base interfaces, and the final type implements all the interfaces listed by all the partial declarations. Any class, struct, or interface members declared in a partial definition are available to all the other parts. The final type is the combination of all the parts at compile time.

Note:

The partial modifier is not available on delegate or enumeration declarations.

The following example shows that nested types can be partial, even if the type they are nested within is not partial itself.

class Container

{

partial class Nested

{

void Test() { }

}

partial class Nested

{

void Test2() { }

}

}

At compile time, attributes of partial-type definitions are merged. For example, consider the following declarations:

[System.SerializableAttribute]

partial class Moon { }

[System.ObsoleteAttribute]

partial class Moon { }

They are equivalent to the following declarations:

[System.SerializableAttribute]

[System.ObsoleteAttribute]

class Moon { }

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

Примечание.

Модификатор partial нельзя использовать для объявлений делегата или перечисления.

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

---

При компиляции атрибуты определений разделяемого типа объединяются. В качестве примера рассмотрим следующие объявления:

--

Они эквивалентны следующим объявлениям:

[System.SerializableAttribute]

[System.ObsoleteAttribute]

class Moon { }

The following are merged from all the partial-type definitions:

For example, consider the following declarations:

partial class Earth : Planet, IRotate { }

partial class Earth : IRevolve { }

They are equivalent to the following declarations:

class Earth : Planet, IRotate, IRevolve { }

Следующие элементы объединяются изо всех определений разделяемого типа:

В качестве примера рассмотрим следующие объявления:

partial class Earth : Planet, IRotate { }

partial class Earth : IRevolve { }

Они эквивалентны следующим объявлениям:

class Earth : Planet, IRotate, IRevolve { }

Restrictions

There are several rules to follow when you are working with partial class definitions: