Guía de programación de C#
Definiciones de clase parciales (Guía de programación de C#)

Es posible dividir la definición de una clase, estructura o interfaz en dos o más archivos de código fuente. Cada archivo de código fuente contiene una parte de la definición de clase y todas las partes se combinan cuando se compila la aplicación. Existen diversas situaciones en las que es conveniente dividir una definición de clase:

  • Al trabajar en proyectos grandes, desplegar una clase en archivos independientes permite que varios programadores trabajen simultáneamente 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 de contenedor de 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 de palabra clave partial, como se muestra a continuación:

C#
public partial class Employee
{
    public void DoWork()
    {
    }
}

public partial class Employee
{
    public void GoToLunch()
    {
    }
}
Comentarios

La utilización de la palabra clave partial indica que otras partes de la clase, estructura o interfaz se pueden definir dentro del 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 de las partes se declara abstracta, todo el tipo se considera abstracto. Si alguna de las partes se declara sellada, todo el tipo se considera sellado. Si alguna de las partes 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 declarados 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.

NoteNota

El modificador partial no está disponible en declaraciones de delegado o enumeración.

Los tipos anidados pueden ser parciales, aunque el tipo en el que están anidados no sea propiamente parcial. Por ejemplo:

C#
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, las siguientes declaraciones:

C#
[System.SerializableAttribute]
partial class Moon { }

[System.ObsoleteAttribute]
partial class Moon { }

equivalen a:

C#
[System.SerializableAttribute]
[System.ObsoleteAttribute]
class Moon { }
  • Los siguientes elementos se combinan a partir de todas las definiciones de tipo parcial:

  • comentarios XML

  • interfaces

  • atributos de parámetro de tipo genérico

  • atributos de clase

  • miembros

Por ejemplo, las siguientes declaraciones:

C#
partial class Earth : Planet, IRotate { }
partial class Earth : IRevolve { }

equivalen a:

C#
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:

    C#
    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, por ejemplo:

    C#
    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:

Ejemplo 1

Description

En el siguiente ejemplo, los campos y el constructor de la clase, CoOrds, se declaran en una definición de clase parcial, mientras que el miembro PrintCoOrds se declara en otra definición de clase parcial.

C#
public partial class CoOrds
{
    private int x;
    private int y;

    public CoOrds(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

public partial class CoOrds
{
    public void PrintCoOrds()
    {
        System.Console.WriteLine("CoOrds: {0},{1}", x, y);
    }

}

class TestCoOrds
{
    static void Main()
    {
        CoOrds myCoOrds = new CoOrds(10, 15);
        myCoOrds.PrintCoOrds();
    }
}
Resultado

CoOrds: 10,15

Ejemplo 2

Description

El siguiente ejemplo muestra que también se pueden desarrollar estructuras e interfaces parciales.

C#
partial interface ITest
{
    void Interface_Test();
}

partial interface ITest
{
    void Interface_Test2();
}

partial struct S1
{
    void Struct_Test() { }
}

partial struct S1
{
    void Struct_Test2() { }
}
Especificación del lenguaje C#

Para obtener más información, vea las siguientes secciones de Especificación del lenguaje C#.

  • 23 tipos parciales

Vea también

Referencia

Interfaces (Guía de programación de C#)
partial (Referencia de C#)

Conceptos

Guía de programación de C#
Clases (Guía de programación de C#)
Estructuras (Guía de programación de C#)

Etiquetas :


Page view tracker