Existen diversas situaciones en las que es conveniente dividir una definición de clase:
Al trabajar en proyectos grandes, el hecho de dividir una clase en archivos independientes permite que varios programadores trabajen al mismo tiempo con ella.
Al trabajar con un código fuente generado automáticamente, se puede agregar el código a la clase sin tener que volver a crear el archivo de código fuente. Visual Studio utiliza este enfoque al crear formularios Windows Forms, código contenedor de un servicio web, etc. Se puede crear código que utilice estas clases sin tener que modificar el archivo creado por Visual Studio.
Para dividir una definición de clase, utilice el modificador partial, como se muestra a continuación:
public partial class Employee
{
public void DoWork()
{
}
}
public partial class Employee
{
public void GoToLunch()
{
}
}
La palabra clave partial indica que otras partes de la clase, estructura o interfaz se pueden definir en el espacio de nombres. Todas las partes deben utilizar la palabra clave partial. Todas las partes deben estar disponibles en tiempo de compilación para formar el tipo final. Todas las partes deben tener la misma accesibilidad, ya sea public, private, etc.
Si alguna parte se declara abstracta, todo el tipo se considera abstracto. Si alguna parte se declara sealed, todo el tipo se considera sealed. Si alguna parte declara un tipo base, todo el tipo hereda esa clase.
Todas las partes que especifican una clase base deben concordar, pero las partes que omiten una clase base heredan igualmente el tipo base. Las partes pueden especificar diferentes interfaces base, pero el tipo final implementa todas las interfaces mostradas por todas las declaraciones parciales. Cualquier miembro de clase, estructura o interfaz declarado en una definición parcial está disponible para todas las demás partes. El tipo final es la combinación de todas las partes en tiempo de compilación.
Nota: |
|---|
El modificador partial no está disponible en declaraciones de delegado o enumeración. |
El siguiente ejemplo muestra que los tipos anidados pueden ser parciales, aunque el tipo en el que están anidados no sea propiamente parcial.
class Container
{
partial class Nested
{
void Test() { }
}
partial class Nested
{
void Test2() { }
}
}
En tiempo de compilación, se combinan los atributos de definiciones de tipo parcial. Por ejemplo, consideremos las siguientes declaraciones:
[SerializableAttribute]
partial class Moon { }
[ObsoleteAttribute]
partial class Moon { }
Son equivalentes a las declaraciones siguientes:
[SerializableAttribute]
[ObsoleteAttribute]
class Moon { }
Los siguientes elementos se combinan a partir de todas las definiciones de tipo parcial:
Por ejemplo, consideremos las siguientes declaraciones:
partial class Earth : Planet, IRotate { }
partial class Earth : IRevolve { }
Son equivalentes a las declaraciones siguientes:
class Earth : Planet, IRotate, IRevolve { }
Restricciones
Existen varias reglas que se deben seguir al trabajar con definiciones de clase parciales:
Todas las definiciones de tipo parcial creadas para ser parte del mismo tipo deben modificarse con partial. Por ejemplo, las siguientes declaraciones de clase generan un error:
public partial class A { }
//public class A { } // Error, must also be marked partial
El modificador partial sólo puede aparecer inmediatamente antes de las palabras clave class, struct o interface.
Se permiten tipos parciales anidados en definiciones de tipo parcial, como se muestra en el siguiente ejemplo:
partial class ClassWithNestedClass
{
partial class NestedClass { }
}
partial class ClassWithNestedClass
{
partial class NestedClass { }
}
Todas las definiciones de tipo parcial que deben ser parte del mismo tipo deben definirse en el mismo ensamblado y el mismo módulo (archivo .exe o .dll). Las definiciones parciales no pueden abarcar varios módulos.
Los parámetros de nombre de clase y tipo genérico deben coincidir en todas las definiciones de tipo parcial. Los tipos genéricos pueden ser parciales. Todas las declaraciones parciales deben utilizar los mismos nombres de parámetro en el mismo orden.
Las siguientes palabras clave en una definición de tipo parcial son opcionales, pero si hay alguna en una definición de tipo parcial, no puede entrar en conflicto con las palabras clave especificadas en otra definición parcial para el mismo tipo: